RStudio presentation / slidify / pandoc中的两列布局

时间:2013-12-30 20:53:08

标签: r knitr rstudio r-markdown slidify

我正在努力想出一个用于生成幻灯片和附带讲义的好系统。理想的系统具有以下属性:

  • 美丽的演示文稿(PDF / HTML)和讲义(PDF)布局(讲义应有空间记笔记)
  • 嵌入式R块,数字,其他JPG / PNG图片等
  • 易于撰写
  • 使用命令行工具构建
  • 参考书目支持
  • pandoc幻灯片分隔符格式(在指定级别的标题后自动生成新幻灯片)是首选
  • 我可以接受一些额外的处理(例如通过sed),但不想写一个庞大的基础设施
  • 两列布局:有一个SO post on how to get multi-column slides from pandoc,但它是LaTeX-而不是面向HTML。
  • 能够动态调整嵌入图像的大小(R生成的图形除外)和列宽

以下是我迄今为止发现的各种选项:

  • Slidify
    • 虽然there is a workaround
    • ,却没有pandoc幻灯片分隔符格式
    • 创建讲义的建议是打印到PDF;我想为笔记留出空间等等(我可能想办法用PDFtkpsnup等方式做到这一点......)
  • RStudio个演示文稿(.Rpres个文件):
    • 很好地做了很多事情,包括具有指定宽度的多列
    • 不支持pandoc幻灯片分隔格式
    • 我无法弄清楚引擎盖下发生了什么。 RStudio documentation描述了常规HTML的翻译过程,但它似乎没有涵盖R表示格式(这不完全相同)。 (我之前在figuring out how to get RStudio-like output via pandoc ...)投入了一些精力,这意味着我无法从命令行生成幻灯片等。
  • RStudio's Development Version(截至2014年3月)捆绑了Pandoc和rmarkdown的第2版。它使用.Rpres格式解决了上述许多问题。
  • pandoc:可能是唯一具有脚注,参考书目支持等功能的降价转换器。我也可以使用pandoc使用tufte-handout class生成LaTeX,符合我的美丽标准。
    • 不幸的是,似乎没有内置的双列格式支持。 Yihui Xie's HTML5 example没有显示任何两列示例,它声称(在幻灯片5中)单击RStudio中的“Knit HTML”按钮等同于pandoc -s -S -i -t dzslides --mathjax knitr-slides.md -o knitr-slides.html,但它似乎不是...
  • LaTeX / beamer:我可以简单地用Rnw(knitr-dialect Sweave)而不是R markdown开始。这会给我最大的灵活性......
    • 尽管使用了多年的乳液,但我确实发现乳液成分比降糖成分更令人痛苦。

毕竟,我的具体问题是:为HTML输出生成双列布局的最佳(最简单)方法是什么?

任何其他建议也将受到赞赏。

7 个答案:

答案 0 :(得分:27)

这是一个古老的问题,但最近我被一个类似的问题所困扰,这是我发现的:

使用RPres格式,可以像这样指定两列(details)。请注意,只能通过单击RStudio中的按钮将RPres转换为HTML,这似乎不是任何命令行方法,这有点烦人。尽管如此,我还是说它是目前使用降价获取幻灯片列的最简单,最灵活的方法:

=== 

Two Column Layout  
===

This slide has two columns

***

```{r, echo=FALSE}
plot(cars)
```

enter image description here

通过调整色谱柱比例可以提供一些灵活性:

===

Two Column Layout  
===
left: 30%
This slide has two columns

***

```{r, echo=FALSE}
plot(cars)
```

enter image description here

使用rmarkdown我们可以获得两列,但无法控制中断的位置,这有点问题:

---
output: ioslides_presentation
---


## Two Column Layout  {.columns-2}

This slide has two columns


```{r, echo=FALSE}
plot(cars)
```

enter image description here

我们还可以使用RStudio中的beamer_presentation格式在一个Rmd文件中混合markdown和LaTeX来获得这样的两列,但不能在任一列中运行任何代码,这是一个限制:< / p>

---
output: beamer_presentation
---

Two Column Layout 
-------

\begin{columns}
\begin{column}{0.48\textwidth}
This slide has two columns
\end{column}
\begin{column}{0.48\textwidth}
If I put any code in here I get an error, see
https://support.rstudio.com/hc/communities/public/questions/202717656-Can-we-have-columns-in-rmarkdown-beamer-presentations-
\end{column}
\end{columns}

enter image description here

看起来像常规的Rnw LaTeX doc是获取列的最佳方式,如果你想使用LaTex,而不是这种降价混合(参见two column beamer/sweave slide with grid graphic

在上述所有情况中,图像可以放在一列中。

slidify网站有关于在此处添加两列的说明:http://slidify.org/customize.html但不清楚要进入资产/布局文件夹以使其正常工作

答案 1 :(得分:11)

我现在拥有的是一个合理的解决方案,至少应该适用于基于ioslides的解决方案,也许(?)适用于其他基于HTML5的格式。从here开始,我添加了

<style>
div#before-column p.forceBreak {
    break-before: column;
}
div#after-column p.forceBreak {
    break-after: column;
}
</style>

到我的文件的开头;然后将<p class="forceBreak"></p>放在带有{.columns-2}的幻灯片中,以便在该点打破列,例如

## Latin hypercube sampling {.columns-2}

- sample evenly, randomly across (potentially many) uncertain parameters

<p class="forceBreak"></p>

![](LHScrop.png)
[User:Saittam, Wikipedia](https://commons.wikimedia.org/wiki/File:LHSsampling.png#/media/File:LHSsampling.png)

可能有更好的方法,但这并不太痛苦。

@ChrisMerkord在评论中指出

.forceBreak { -webkit-column-break-after: always; break-after: column; }

代替工作(我还没有测试过......)

答案 2 :(得分:6)

我从HERE得到了一个想法,基本解决方案是:

### Function *inner_join*
. . .

`<div style="float: left; width: 50%;">`
``` {r, echo = FALSE, results = 'markup', eval = TRUE}
kable(cbind(A,B))                                    
```
`</div>`
`<div style="float: right; width: 50%;">`
```{r, echo = TRUE, results = 'markup', eval = TRUE}
inner_join(A,B, by="C")
```
`</div>`

答案 3 :(得分:6)

投影仪错误有workaround

简而言之:错误与pandoc转换引擎有关,该引擎将\begin{...}\end{...}之间的所有内容视为 TeX 。通过在yaml标头中为begin{column}end{column}提供新定义,可以避免这种情况。

创建mystyle.tex并在那里写:

\def\begincols{\begin{columns}}
\def\begincol{\begin{column}}
\def\endcol{\end{column}}
\def\endcols{\end{columns}}
  

在Rmd文件中使用这些新的定义

---
output:
  beamer_presentation:
    includes:
      in_header: mystyle.tex
---


Two Column Layout 
-------

\begincols
  \begincol{.48\textwidth}

This slide has two columns.

  \endcol
\begincol{.48\textwidth}

```{r}
#No error here i can run any r code
plot(cars)
```

  \endcol
\endcols

你得到: enter image description here

答案 4 :(得分:3)

到目前为止,我还没有比在rmd格式之上破解我自己的一点标记更好:我调用我的源文件rmd0并运行包含此{的脚本{在调用sed之前,{1}}将其翻译为rmd

knit

我不喜欢这个原因。 (1)它是丑陋和特殊目的,我没有一个特别好的方法来允许可选参数(例如列的相对宽度,对齐等)。 (2)必须针对每种输出格式进行调整(例如,如果我想要LaTeX / beamer输出,我需要替换sed -e 's/BEGIN2COLS\(.*\)/<table><tr><td style="vertical-align:top; width=50%" \1>/' \ -e 's/SWITCH2COLS/<\/td><td style="vertical-align:top">/' \ -e 's/END2COLS/<\/td><\/tr><\/table>/' ... (因为事实证明我想在制作LaTeX时忽略两列格式化) - 格式化讲义,所以它更容易一些,但它仍然很难看。

Slidify可能就是答案。

答案 5 :(得分:1)

您可以使用fenced_divs表示法或:::创建列或“两个内容的布局”。另请参见this page,以了解有关该符号的更多信息。

## Slide With Image Left

::: columns

:::: column
left
::::

:::: column
right

```{r your-chunk-name, echo=FALSE, fig.cap="your-caption-name"}
knitr::include_graphics("your/figure/path/to/the-image.pdf")

#The figure will appear on the right side of the slide...
```
::::

:::

由于在pandoc 2+中实现了支持符号的RStudio v1.2+,因此您可能需要首先安装RStudio v1.2+。安装很容易(至少在我看来);只需下载并安装RStudio v1.2+。在安装方式中,您计算​​机上的RStudio的旧版本将被新版本替换,而无需手动卸载。

即使您使用:::选项编织.Rmd文件,以及创建HTML幻灯片时,也可以使用beamer_presentation表示法。因此,我们既不必在一个文件中混合使用markdown和LaTeX表示法,也不必再添加其他代码:只需在编织其他.Rmd与其他选项的同时编织文件即可。

答案 6 :(得分:0)

这不是直接的解决方案,但是Yihui的Xaringan软件包https://github.com/yihui/xaringan/对我有用。它基于remark.js。在默认模板中,您可以使用.pull-left[].pull-right[]。示例:https://slides.yihui.name/xaringan/#15。您只需要对现有.rmd文件进行最小调整。