在不更改当前设置的情况下使用 Rmd pdf 的自定义模板

Using a custom template for Rmd pdf without changing current setup

我最近了解到修改 Rmd pdf 报告的默认 (Pandoc?) 模板

因此,为了修改默认模板,我首先使用以下命令将其移动到我的工作目录:

file.copy(system.file("rmd/latex/default-1.17.0.2.tex", package ="rmarkdown"), "template.tex")

接下来我输入我的 Rmd 文件:

---
output:
  pdf_document:
    template: template.tex
    keep_tex: true
    latex_engine: xelatex
    includes:
      in_header: in_header.tex
    number_sections: true
---

This is a rmd kind of document.

其中 in_header.tex 仅包含一行

\geometry{a4paper, top=38mm, left=45mm, right=45mm}

我首先只想 运行 Rmd 文件的模板保持原样(希望没有变化)但是报告无法编译 当且仅当 我包含了模板 - 否则它 运行 没有问题。

错误是

! Undefined control sequence.
l.58 \geometry
[...]

问题

如何使用模板参数在我的工作文件夹中的可编辑模板上进行构建,而不会对我的当前设置造成任何其他更改。

信息

> R.Version()[["version.string"]]
[1] "R version 3.5.1 (2018-07-02)"
> packageVersion("rmarkdown")
[1] ‘1.10’
> packageVersion("knitr")
[1] ‘1.20’

当使用 default 模板时,rmarkdown::pdf_output 函数似乎做了一些不同的事情。例如,它设置变量 graphics=yes。我怀疑它也设置了 geometry,但我没有看到它在哪里设置。无论如何,如果您想使用基于默认模板的自定义模板,您可以 "fighting" 使用模板中的此块:

$if(geometry)$
\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
$endif$

仅在定义几何 header 时加载 geometry 包。解决您的问题的一个简单方法是将几何定义从 header 包含移动到 YAML header:

---
geometry:
  - a4paper
  - top=38mm
  - left=45mm
  - right=45mm
output:
  pdf_document:
    template: template.tex
    keep_tex: true
    latex_engine: xelatex
    includes:
      in_header: in_header.tex
    number_sections: true
---

This is a rmd kind of document.

有了这个,您可以从 in_header.tex 中删除 \geometry{...}

由于您已经从 R 驱动它,您也可以使用 rticles 包设置的(优秀)示例,它为(学术)论文提供了大量的 LaTeX 定制。

然后您可以 运行 与他们交流。例如,在过去的两年里,我添加了这些包:

  • tint 现代 'Tufte-alike' 写作
  • pinp 非常漂亮的两栏 pdf 插图
  • link 用于 LaTeX 字母和一些额外的
  • binb 用于 beaner 包的变体

这让您可以

  • 设置自定义 template.tex
  • 包含您需要的任何 LaTeX class 文件/样式文件
  • 以编程方式设置选项

我发现这比复制我之前所做的节(例如幻灯片)更可取。