2013-03-04 67 views
1

我在RStudio中使用帶有XeLaTeX的knitr。我使用塊緩存,這樣我不必在每次編譯文檔時都重新運行某些代碼。這個最小的例子表明,如果fontspec軟件包被加載,緩存似乎被破壞。通過RStudio使用XeLaTeX fontspec包時,knitr緩存失敗

\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軟件包未加載,則不會發生此錯誤。

我的問題是:這是一個錯誤,還是有我的代碼有問題?我正在使用tikzDevice(0.6.3)在R(R開發中(不穩定)(2012-11-10 r61101))通過RStudio(0.97.246)使用knitr(1.1)(通過RStudio Server通過瀏覽器訪問) )本身運行在Ubuntu(12.04.2 LTS)上。我的LaTeX2e的日期是< 2009/09/24>。

回答

2

請勿將options(tikzDefaultEngine="xetex")放入緩存塊中,因爲它具有無法緩存的副作用,所以在第二次編譯文檔時,此選項將被跳過。請閱讀knitr網站上的Important Notes in the cache page部分。

請注意,您不需要library(tikzDevice);當您設置dev='tikz'時,此包將自動加載。

在大多數情況下,您應該緩存plot chunk,因爲它創建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}