通过RStudio使用XeLaTeX fontspec包时,knitr缓存失败

时间:2013-03-04 15:39:19

标签: r latex knitr rstudio fontspec

我在RStudio中使用knitr和XeLaTeX。我使用块缓存,这样我每次编译文档时都不必重新运行某些代码。此最小示例显示,如果加载了fontspec包,则缓存似乎已被破坏。

\documentclass{article}
\usepackage{fontspec} % Appears to somehow conflict with caching.

\begin{document}

<<pre_load, cache=TRUE>>=
library(tikzDevice)
options(tikzDefaultEngine="xetex")
@

\section{Test}
<<test_block, dev='tikz', dependson='pre_load'>>=
plot(1:10,main='Test')
@

\end{document}

第一次将此文档编译为PDF时,它将起作用,因为不使用缓存。但是,如果对test_block块进行了更改,并且代码再次运行,则会失败。例如,在编译为PDF后,将test_block块更改为:

<<test_block, dev='tikz', dependson='pre_load'>>=
plot(1:10,main='Test Modified')
@

现在,编译为PDF失败,出现以下错误:

! 
 ********************************************
 * XeTeX is required to compile this document.
 * Sorry!
 ********************************************.
\RequireXeTeX ...********************************}
                                                  \endgroup \fi 
l.18 \RequireXeTeX

此错误表示尚未设置options(tikzDefaultEngine="xetex")。有趣的是,如果未加载fontspec包,则不会发生此错误。

我的问题是:这是一个错误,还是我的代码有问题?

我正在使用knitr(1.1)在R(R Under Developing(unstable)(2012-11-10 r61101)上使用tikzDevice(0.6.3)通过RStudio(0.97.246)(通过浏览器通过RStudio Server访问)它本身运行在Ubuntu(12.04.2 LTS)上。我的LaTeX2e日期为&lt; 2009/09/24&gt;。

1 个答案:

答案 0 :(得分:2)

不要将options(tikzDefaultEngine="xetex")放在缓存的块中,因为它具有无法缓存的副作用,因此第二次编译文档时,将跳过此选项。请阅读knitr网站上的Important Notes in the cache page部分。

请注意,您也不需要library(tikzDevice);设置dev='tikz'时会自动加载此包。

在大多数情况下,您应该缓存绘图块,因为创建TikZ图形的速度很慢。

\documentclass{article}
\usepackage{fontspec} % Appears to somehow conflict with caching.

\begin{document}

<<pre_load>>=
options(tikzDefaultEngine="xetex")
@

\section{Test}
<<test_block, dev='tikz'>>=
plot(1:10,main='Test')
@

\end{document}