我想插入名为" 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)}''.
我做错了什么?
答案 0 :(得分:2)
这与knitr
或R没有任何关系,而是关于在LaTeX中插入下划线。最简单的方法是将其放在\verb
命令中,例如
When sanitized, it's ``\verb!\Sexpr{sanitize(foo)}!''.
knitr
运行后,会变为
When sanitized, it's ``\verb!test \\& \\_!''.
如果需要,您可以更改sanitize()
函数以添加\verb
包装器。任何产生“后”线的东西。
编辑添加:
如果您真的想要保持代码突出显示,则需要执行类似https://tex.stackexchange.com/questions/70652/alltt-packages-alltt-makes-a-newline的操作来创建一个宏,该宏执行\verb
所做的一些操作,但不是全部。这也需要改变你的
消毒功能。