通过 out.width 在 Rmd 中缩放绘图

Scaling plots in Rmd via out.width

我正在生成一个 Rmd 文档,其中还包含一些图。它应该导出为 otd 和 pdf。一些数字应该足够小,以便在生成的 odt 中将其中两个并排放置。

我通过

编织文档
Rscript -e "require(knitr); require(markdown); knit('Test_Markdown.Rmd', 'Test_Markdown.md')"

在 Rmd 中有一个看起来像这样的情节:

```{r plottestnormal, fig.path = ".", fig.width = 6, fig.height = 6, dpi = 300, dev = "png", dev.args = list(type = "cairo")}
plot(1:10, 1:10)
```

我希望情节是一半大小 -- 但按比例缩放!

这得到了正确的大小,但不是缩放:

```{r plottestsmall, fig.path = ".", fig.width = 3, fig.height = 3, dpi = 600, dev = "png", dev.args = list(type = "cairo")}
plot(1:10, 1:10)
```

我从 the opiton description 中了解到,以下内容应该符合我的意思,但它不会 'work'。

```{r plottestscaled, fig.path = ".", fig.width = 6, fig.height = 6, out.width = 3, out.height = 3, dpi = 300, dev = "png", dev.args = list(type = "cairo")}
plot(1:10, 1:10)
```

发生的事情是,这会在生成的 *md 文件中产生一个 html img 标签:

<img src=".plottestscaled-1.png" title="plot of chunk plottestscaled" alt="plot of chunk plottestscaled" width="3" height="3" />

使用

编译时,pdf 和 odt 中均未显示
pandoc -f markdown "Test_Markdown.md" -o "Test_Markdown.odt"

pandoc -t latex "Test_Markdown.md" -o "Test_Markdown.pdf"

而且我已经看到 this issue 这对我没有进一步的帮助。

我错过了什么?

编辑:

感谢@Yihui,这现在适用于 LaTeX-> pdf 和(大概 -- 未经测试)html。

我说得对吗,*.odt*.docx 导出不支持 out.widthout.height

如果是,它们对我不起作用的原因可能是什么?

如果不是,我怎样才能在 *.odt 中实现相同的效果(缩放图)?

(我想导出到 pdfodt,因此理想情况下任何解决方案都可以(至少)同时涵盖这两个。)

这是一个完整的文档,显示了我在通过 rmarkdown::render("Test_Markdown.Rmd", "all") 处理时遇到的问题。

---
title: Scale plot in Rmd
output:
    pdf_document:
        latex_engine: xelatex
    odt_document:
        keep_md: true
---

```{r plottestscaled, fig.path = "./", fig.width = 6, fig.height = 6, out.width = "3in", out.height = "3in", dpi = 300, dev = "png", dev.args = list(type = "cairo")}
plot(1:10, 1:10)
```

编辑 2:

我的 'best' 解决方案目前是禁用 odt 输出中的缩放并在办公室手动重新缩放绘图。不是很可重现,虽然....

```{r plottestscaled, fig.path = "./", fig.width = 6, fig.height = 6, out.width=switch(opts_knit$get("rmarkdown.pandoc.to"), latex = "3in", NULL), out.height=switch(opts_knit$get("rmarkdown.pandoc.to"), latex = "3in", NULL), dpi = 300, dev = "png", dev.args = list(type = "cairo")}
plot(1:10, 1:10)

Pandoc 的 Markdown 直到最近的版本才支持指定图像的大小,因此当您指定绘图的宽度时,knitr 必须退回到 HTML,并且 HTML 代码不适用于 LaTeX 或 ODT 输出(仅支持原生 Markdown 代码,但 LaTeX 输出除外,其中也支持原始 LaTeX 代码)。

简短的回答是自己使用 rmarkdown 包而不是 运行 Pandoc。 knitr 会足够聪明,在生成具有宽度属性的图形时切换到 LaTeX 代码。或者更好的是,只需单击 RStudio IDE.

中的 Knit 按钮

如果你愿意,你可以尝试弄清楚幕后的所有技术细节(从 knitr::hook_plot_md 开始),但如果你不熟悉 knitrrmarkdown 在内部工作。