Файл knitr завершился во время сканирования с использованием \@xverbatim

У меня есть следующее .Rnw файл:

\documentclass{article}

\usepackage[table]{xcolor}
\usepackage{multicol}

\begin{document}

\begin{multicols}{2}
\hskip-3.5cm\begin{tabular}{|l|}
\hline
\cellcolor[RGB]{0,0,140}{\large\textbf{\textcolor{white}{Bill To: }}}\\
\hline

\textbf{
"asdf"
}\\
\\[-1em]
\textbf{asdf@asdf.com} \\
\hline
\end{tabular}
\hskip6cm\begin{tabular}{|l|l|}
\hline
Date: & 05/31/2018 \\
\hline
Invoice \#: & 1234asdf \\
\hline
\end{tabular}
\end{multicols}


\end{document}

что дает мне ожидаемый PDF:

Однако, когда я заменяю "asdf" кодом R:

\documentclass{article}

\usepackage[table]{xcolor}
\usepackage{multicol}

\begin{document}

\begin{multicols}{2}
\hskip-3.5cm\begin{tabular}{|l|}
\hline
\cellcolor[RGB]{0,0,140}{\large\textbf{\textcolor{white}{Bill To: }}}\\
\hline

\textbf{
<<asdf>>=
cat("asdf")
@
}\\
\\[-1em]
\textbf{asdf@asdf.com} \\
\hline
\end{tabular}
\hskip6cm\begin{tabular}{|l|l|}
\hline
Date: & 05/31/2018 \\
\hline
Invoice \#: & 1234asdf \\
\hline
\end{tabular}
\end{multicols}


\end{document}

Я получаю следующую ошибку:

File ended while scanning use of \@xverbatim

Глядя на сгенерированный .tex файл, это соответствующая часть:

\textbf{
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlkwd{cat}\hlstd{(}\hlstr{"asdf"}\hlstd{)}
\end{alltt}
\begin{verbatim}
## asdf
\end{verbatim}
\end{kframe}
\end{knitrout}
}\\

и это то, что .log Файл говорит:

Runaway argument?
 #### asdf \end {verbatim} \end {kframe} \end {knitrout} \check@icr \expandafte
r \ETC.
! File ended while scanning use of \@xverbatim.
<inserted text> 
                \par 
<*> test2.tex

I suspect you have forgotten a `}', causing me
to read past where you wanted me to stop.
I'll try to recover; but if the error is serious,
you'd better type `E' or `X' now and fix your file.

! Emergency stop.
<*> test2.tex

Что я делаю неправильно?

1 ответ

По умолчанию вывод R упакован в дословную среду LaTeX, и вы не можете поместить один из них внутрь \textbf, Есть несколько разных подходов, чтобы исправить это.

Самое простое - просто использовать параметр чанка. results='asis'т.е.

\textbf{
<<asdf,results='asis',echo=FALSE>>=
cat("asdf")
@
}

Это предотвратит knitr от добавления среды вокруг выхода; код LaTeX будет просто

\textbf{
asdf
}

что должно быть хорошо.

Если вы хотите форматирование по умолчанию, но просто хотите изменить шрифт или стиль текста, все будет сложнее. Вы должны сказать knitr использовать другую среду вместо verbatimнапример, Verbatim среда, предоставляемая fancyvrb пакет. Вы можете сделать это, изменив выходной хук. Например, это должно работать

% in the preamble:
\usepackage{fancyvrb}
<<include=FALSE>>=
oldhook <- knitr::knit_hooks$get("output")
bold <- function(x, options)
  paste0("\\begin{Verbatim}[fontseries=b]\n", x, "\\end{Verbatim}")
@

% in the body:
<<asdf,echo=FALSE>>=
knitr::knit_hooks$set(output = bold)
cat("asdf")
@
% Optionally restore the old hook...
<<include=FALSE>>=
knitr::knit_hooks$set(output = oldhook)
@

Тем не менее, это не всегда работает, потому что некоторые варианты (например, fontseries=b) конфликтует с настройками, которые knitr делает. Вы можете изменить курсив (используя fontshape=it), но не жирным шрифтом. Так что придерживайтесь первого предложения.

Другие вопросы по тегам