引言

最近要开始写时间序列的作业了,作业里面既有代码,又有公式,没法轻易用 LaTeX 搞定了,就回到以前用的 R+knitr ,写 rnw 了。以前是在 Rstudio 上面写,基本不用配置什么,但是 Rstudio 的 LaTeX 支持真的一般。现在切换到了 vscode, 用 LaTeX Workshop 写,还支持 rnwjnw。为了配置好 rnw 我真的踩了很多坑,到现在其实也还没有完全配置好。

配置方案

以前写 LaTeX 的时候,我是特别喜欢用 magic comments 的,因为特别方便,只要在主文档开头加上

1
2
%!TEX program=xelatex
%!BIB program=biber

就能设置 xelatexbiber。但是,在 rnw 里面不能这么干,否则自动编译会出问题,因为默认情况下,在 没有 magic comments 的时候,自动构建rnw 会使用第一个含有 rnw 的 Recipe, 具体来说就是

Recipe: Compile Rnw files,但是,有了 magic comments, 就会使用 magic comments 去构建!

例子

下面是一个例子,去掉首行,一切正常,但是带上它,你会发现 R 代码不会被自动编译。第一次手动编译一切正常,但是当你把 2*x 改成 3*x ,触发自动编译,结果 pdf 确实会刷新,但是pdf 里面还是 2*x

1
2
3
4
5
6
7
8
9
%!TEX program=xelatex
\documentclass{article}
\begin{document}
<<>>=
x=c(1:5)
x
2*x
@
\end{document}

配置

如果你的文档不需要中文,那当然直接把首行的 magic comments 删除就好啦。如果需要中文,这时候可以通过 latexmk 来实现,latexmk的文档可以通过 texdoc latexmk 来查看(如果你装了 texlive 的话)。

具体到我们的例子,我们需要一个 .latexmkrc 文件,与我们的 rnw 文件在同一目录下。但是 CTAN 给我们提供了一些模板 latexmkrc,可以下载 knitr-latexmkrc,改名为 .latexmkrc,并修改它里面 $pdflatex 的定义:

1
2
-$pdflatex = "pdflatex -interaction=nonstopmode -synctex=1 %O %B ;"
+$pdflatex = "xelatex -interaction=nonstopmode -synctex=1 %O %B ;"

其他的行不变。

另外,需要注意,此后我们的 rnw 文件需要把拓展名改为 Rnw,而不是 rnw

之后就可以愉快的在 vscode 里面写 rnw 了。

已知问题

rnw 文件中,R 代码的格式化不可用,会全部左对齐,影响最后生成的 pdfR 的代码补全也不可用。

不过可以使用 Rstyler 包来手动格式化。

参考资料

  1. AutoBuild for rnw not working with %!TEX program=xelatex

  2. How to make LaTeXmk work with XeLaTeX and biber

  3. latexmk documentation