Сбой кэширования Knitr при использовании пакета XeLaTeX fontspec через RStudio

Я использую Knitr с XeLaTeX в RStudio. Я использую кэширование фрагментов, чтобы мне не приходилось перезапускать определенный код каждый раз, когда я компилирую свой документ. Этот минимальный пример показывает, что кэширование нарушается, если загружается пакет 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), используя tikzDevice (0.6.3) на R (R в стадии разработки (нестабильный) (2012-11-10 r61101)) через RStudio (0.97.246) (доступ через браузер через RStudio Server), который сам по себе работает на Ubuntu (12.04.2 LTS). Мой LaTeX2e датирован ‹2009/09/24>.


person nograpes    schedule 04.03.2013    source источник


Ответы (1)


Не помещайте options(tikzDefaultEngine="xetex") в кешированный фрагмент, потому что у него есть побочный эффект, который нельзя кэшировать, поэтому при второй компиляции документа этот параметр будет пропущен. Прочтите раздел Важные примечания на странице кэша на knitr веб-сайте.

Обратите внимание, что вам также не нужно 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}
person Yihui Xie    schedule 04.03.2013