\Sexpr 如果包含 LaTeX 命令,则无法解析和评估

\Sexpr cannot be parsed and evaluated if it includes LaTeX-commands

我正在使用 RStudio 和 knitr 创建 pdf。使用 \Sexpr() 我想包含内联代码,它接受一个向量并在其周围放置 \textbf{} 以使其变为粗体,但它不起作用。我在这里找到了一个解决方案:,但它需要事先创建一个额外的对象,我想做所有内联的事情,但后来我收到一个错误:

INCOMPLETE_STRING 1: asis_output(paste0("\textbf{", test,"

\Sexpr()中添加LaTeX命令似乎无法解析和评估,但我不知道为什么。

这里有一个简短的例子来说明我的问题:

% !Rnw weave = knitr

\documentclass{scrartcl}
\begin{document}

<<>>=
test <- c("testA", "testB", "testC")
boldtest <- paste0("\textbf{", test,"}", collapse = " and ")
@

\Sexpr{asis_output(boldtest)}\
%\Sexpr{asis_output(paste0("\textbf{", test,"}", collapse = " and "))}\ % not working
\end{document}

问题是 \Sexprknitr 解析为在第一次出现 } 时结束。我认为没有任何方法可以避免这种情况,因此您需要一种解决方法,例如将右大括号放入变量中。例如,

% !Rnw weave = knitr

\documentclass{scrartcl}
\begin{document}

<<>>=
test <- c("testA", "testB", "testC")
closebrace <- "}"
@

\Sexpr{asis_output(paste0("\textbf{", test, closebrace, collapse = " and "))}\ 
\end{document}

我觉得这种很丑,所以我建议定义一个新的 R 函数来处理乳胶,例如

% !Rnw weave = knitr

\documentclass{scrartcl}
\begin{document}

<<>>=
test <- c("testA", "testB", "testC")
textbf <- function(text) 
  paste0("\textbf{", text, "}")
@

\Sexpr{asis_output(paste0(textbf(test), collapse = " and "))}\ 
\end{document}

如果加粗不是您要插入的唯一 LaTeX,您可能需要一个更通用的函数,为其他操作单独定义:

LaTeXMacro <- function(text, macro) 
  paste0("\", macro, "{", text, "}")

textbf <- function(text)
  LaTeXMacro(text, "textbf")

textit <- function(text)
  LaTeXMacro(text, "textit")