64

我正在尝试想出一个好的系统来生成幻灯片和随附的讲义。理想的系统应具有以下特性:

  • 演示文稿(PDF/HTML)和讲义(PDF)布局都很漂亮(讲义应该有空间做笔记)
  • 嵌入 R 块、图形、其他 JPG/PNG 图片等。
  • 容易作曲
  • 使用命令行工具构建
  • 参考书目支持
  • pandoc幻灯片分隔格式(在指定级别的标题后自动生成新幻灯片)是首选
  • 我可以忍受一点额外的处理(例如 via sed),但不希望编写庞大的基础架构
  • 两列布局:有一篇关于如何从 pandoc 获取多列幻灯片的 SO 帖子,但它是 LaTeX 而非 HTML 导向的。
  • 能够动态调整嵌入图像的大小(R 生成的图形除外)和列宽

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

  • 滑动
    • 不做pandoc幻灯片分隔符格式,虽然有一个解决方法
    • 创建讲义的建议是打印为 PDF;我想为笔记等留出空间。(我可能会想出一种方法来使用PDFtkpsnup...)
  • RStudio演示文稿(.Rpres文件):
    • 可以很好地完成很多事情,包括具有指定宽度的多列
    • 不支持pandoc幻灯片分隔符格式
    • 我无法弄清楚引擎盖下发生了什么。有RStudio 文档描述了常规 HTML 的翻译过程,但它似乎没有涵盖 R 表示格式(不太一样)。(我之前已经投入了一些精力来弄清楚如何通过 pandoc 获得类似 RStudio 的输出......),这意味着我无法从命令行生成幻灯片等。
  • RStudio 的开发版本(截至 2014 年 3 月)与 Pandoc 和rmarkdown. 它解决了上述.Rpres格式的许多问题。
  • pandoc:可能是唯一具有脚注、参考书目支持等功能的降价翻译器。我还可以使用tufte-handout 类pandoc生成 LaTeX ,这符合我的审美标准。
    • 不幸的是,它似乎没有内置的两列格式支持。Yihui Xie 的 HTML5 示例没有显示任何两列示例,它声称(在幻灯片 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 开始。这将给我最大的灵活性......
    • 尽管使用 LaTeX 多年,但我确实发现 LaTeX 组合比降价组合更痛苦。

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

任何其他建议也将不胜感激。

4

7 回答 7

33

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

使用 RPres 格式,可以像这样指定两列(详细信息)。注意RPres只能通过在RStudio中点击一个按钮才能转换成HTML,好像没有任何命令行方法,有点烦人。尽管如此,我想说这是目前获取带有降价的幻灯片列的最简单和最灵活的方法:

=== 

Two Column Layout  
===

This slide has two columns

***

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

在此处输入图像描述

通过调整列比例提供了一些灵活性:

===

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

***

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

在此处输入图像描述

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

---
output: ioslides_presentation
---


## Two Column Layout  {.columns-2}

This slide has two columns


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

在此处输入图像描述

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

---
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}

在此处输入图像描述

如果您想使用 LaTex,而不是这种降价混合(参见带有网格图形的两列投影机/编织幻灯片) ,似乎常规的 Rnw LaTeX 文档是获取列的最佳方式

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

slidify 网站有关于在此处制作两列的说明:http://slidify.org/customize.html尚不清楚必须进入 assets/layouts 文件夹以使其工作

于 2014-12-16T02:00:43.660 回答
18

您可以使用fenced_divs符号或:::创建列或“两个内容布局”。另请参阅此页面以了解有关该符号的更多信息。

## 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使用选项编织文件beamer_presentation以及创建 HTML 幻灯片时,也可以使用该符号。因此,我们不必在一个文件中混合 markdown 和 LaTeX 表示法,也不必再添加其他代码:只需像.Rmd使用其他选项编织其他文件一样编织文件。

于 2018-12-28T09:27:09.467 回答
14

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

<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; }

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

于 2016-02-05T23:43:39.173 回答
8

我从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>`

于 2016-07-06T12:32:20.777 回答
8

有一个投影仪错误的解决方法。

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

你得到: 在此处输入图像描述

于 2017-11-21T08:35:59.043 回答
3

到目前为止,除了在格式之上修改我自己的一点标记之外,我还没有做得更好rmd:我调用我的源文件rmd0并运行一个包含这个sed花絮的脚本,rmd在调用之前将其翻译成knit

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>/' ...

我不喜欢这个有几个原因。(1) 它丑陋且有特殊用途,而且我没有特别好的方法来允许可选参数(例如列的相对宽度、对齐方式等)。(2) 必须针对每种输出格式进行调整(例如,如果我想要 LaTeX/beamer 输出,我需要替换\begin{columns}\begin{column}{5cm} ... \end{column}\begin{column}{5cm} ... \end{column}\end{columns}(因为当我制作 LaTeX 格式讲义时,我想忽略两列格式,所以它更容易一些,但它仍然很丑)。

Slidify 可能仍然是答案。

于 2014-01-13T23:14:25.610 回答
0

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

于 2018-12-29T06:01:32.357 回答