【问题标题】:knitr .Rmd -> Word document: control details of figuresknitr .Rmd -> Word 文档:控制数字的细节
【发布时间】:2016-01-10 23:04:49
【问题描述】:

我正在为一本书制作解决方案手册,使用带有以下 YAML 标头的 .Rmd 文件:

---
title: "DDAR: Solutions and Hints for Exercises"
date: "`r Sys.Date()`"
output: 
  word_document:
    reference_docx: solutions-setup.docx
---

我使用reference_docx 控制文档的总体布局以获取输出 Word 文档。

会有很多图形,我想设置一些全局图形参数,以给出相对紧凑的边界框和合理的字体大小 无需根据我在 PDF 文档中看到的内容进行调整。

我尝试了以下方法,但par() 设置似乎没有任何效果:

{r setup, echo=FALSE} options(digits=4) par(mar=c(5,4,1,1)+.1)

相反,我在文档中得到如下图像,其边界框比我想要的要大,而且字体比我想要的要大得多。

我知道如何在使用 LaTeX 生成的 .Rnw 文件中控制所有这些,但我 在 .Rmd -> Word 中找不到如何操作。有没有我可以的大块钩子 采用?我认为没有 out.width 块选项可以重新缩放 LaTeX 中的图形。

【问题讨论】:

  • 您使用的 par margins 是默认的 R 边距,与您的图像显示的大小差不多。如果你把它们做得更小会发生什么?

标签: r rstudio knitr r-markdown


【解决方案1】:

@scoa 的回答展示了如何使用hook 在每个块的开头设置一些图形参数。这是必要的,因为“默认情况下,knitr 打开一个新的图形设备来记录绘图并在评估代码后将其关闭,因此par() 设置将被丢弃”,即不能在早期设置中设置后期块的图形参数-chunk 但需要分别为每个块设置。

如果不需要这种行为,可以使用package option global.par = TRUE

opts_knit$set(global.par = TRUE)

找到正确的边距值有时会很痛苦。在这些情况下,hook_pdfcrop 可以提供帮助。在选项crop = TRUE 的所有块中,白色边距将被删除。要将其应用于所有块,请使用

library(knitr)
knit_hooks$set(crop = hook_pdfcrop)
opts_chunk$set(crop = TRUE)

这也适用于docx 输出,因为“当绘图格式不是 PDF(例如 PNG)时,ImageMagick 中的程序转换用于修剪白色边距”(来自?hook_pdfcrop)。

请注意,在某些情况下,裁剪图有时会产生明显不同的“缩放”图因子的副作用:这种情况发生在我们从两个图上相同大小的元素开始但其中一个图周围的白边距较大的情况下。如果在裁剪后将两者都调整为固定的输出宽度,则图上具有较大边距的元素看起来更大。但是,这与docx 输出无关,因为在这种情况下不能使用out.width/out.height

【讨论】:

  • opts_knit$set(global.par = TRUE) 是让 knitr 尊重全局 par() 选项的正确方法。我知道 pdfcrop,但这不适用于 MS Word .docx 输出,其中图像都是以 PNG 格式生成的。
  • 啊,我忘记了 docx 上下文。关于你的第一句话:是的。这正是我写的,不是吗?
  • 更新:hook_pdfcrop 也适用于 .docxpng 图像。见? hook_pdfcrop:“当绘图格式不是PDF(例如PNG)时,ImageMagick中的程序转换用于修剪白边”。
【解决方案2】:

knitr documentation for hooks 实际上使用小边距作为使用钩子的示例。这是一个解决方案(改编自本文档)。

---
output: word_document
---

```{r setup, echo=FALSE}
library(knitr)
knit_hooks$set(small.mar = function(before, options, envir) {
    if (before)    par(mar=c(5,4,1,1)+.1)  # smaller margin on top and right
})
opts_chunk$set(small.mar=TRUE)
```

```{r}
plot(iris$Sepal.Length)
```

使用opts_chunk$set(small.mar=TRUE) 是一种避免将其传递给文档中每个块的方法。

边距看起来是固定的(来自 libreoffice 中的 docx 输出的屏幕截图,默认参考 docx)。

【讨论】:

  • 已投赞成票,但您可能需要添加两件事:global.par 用于保留当前块中的par() 设置,hook_pdfcrop 以避免一些边距问题。跨度>
  • @CL。你应该这样回答,它比我的要好。
  • 完成。我认为我们的答案一起提供了一个相当全面的画面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多