在knitr中使用下划线的内联代码

时间:2017-01-30 10:06:01

标签: r knitr

我想插入名为" test_sample()"的函数。作为LaTeX + knitr文档中的内联R代码。

仅包含\Sexpr{'test_sample()'}会导致Missing $错误。

我发现了以下直接相关的问题: Pass underscore as inline code to knitR

但是已经在答案中复制代码对我不起作用:我收到一条R警告信息:

In hilight(code, "latex", ...) :
  the syntax of the source code is invalid; the fallback mode is used

并且在LaTeX中仍然出现Missing $错误。

我尝试通过

采用它
<<>>=
test_ = function(x){gsub("([_])", '\\\\\\_', "test_x")}
@
\Sexpr{test_(sample)} 

但是这仍然导致相同的错误。

如果我在knitr生成的tex文件中手动将转义字符\放在_之前,它可以正常工作,但我无法弄清楚如何自动执行此操作。

当我从这个问题中复制粘贴解决方案时,我也遇到了同样的错误:R, Sweave, LaTeX - escape variables to be printed in LaTeX?

<<echo=FALSE>>=
sanitize <- function(str) {
  result <- str
  result <- gsub("&", "\\\\&", result, fixed = TRUE)
  result <- gsub("_", "\\\\_", result, fixed = TRUE)
  result
}
@ 

<<>>=
(foo <- "test & _")
sanitize(foo)
@ 

When sanitized, it's ``\Sexpr{sanitize(foo)}''.

我做错了什么?

1 个答案:

答案 0 :(得分:2)

这与knitr或R没有任何关系,而是关于在LaTeX中插入下划线。最简单的方法是将其放在\verb命令中,例如

When sanitized, it's ``\verb!\Sexpr{sanitize(foo)}!''.

knitr运行后,会变为

When sanitized, it's ``\verb!test \\& \\_!''.

显示您可能想要的内容,即 enter image description here

如果需要,您可以更改sanitize()函数以添加\verb包装器。任何产生“后”线的东西。

编辑添加:

如果您真的想要保持代码突出显示,则需要执行类似https://tex.stackexchange.com/questions/70652/alltt-packages-alltt-makes-a-newline的操作来创建一个宏,该宏执行\verb所做的一些操作,但不是全部。这也需要改变你的 消毒功能。