3

它与默认的内联钩子有关,我意识到这一点并且我已经尝试使用它(钩子)并且还阅读了这个线程和 Yihui 的关于 hooks 的页面,但我无法解决我的问题。我什至尝试了 Sacha Epskamp 的这个建议,但在我的情况下它并没有做到这一点。

我正在使用\Sexpr和做一些事情\Sexpr{load("meta.data.saved"); meta.data[1,7]}来打印我的报告中的关键字,问题是编写这些关键字的人(我无法控制的人)正在使用特殊的 LaTeX 字符($、&、%、# 等。 ) 并且当它们被传递给我的 .tex 文件时,我过得很\糟糕。

我有一个包含此代码的 .Rnw 文件,

\documentclass{article}
\begin{document}
 Look \Sexpr{foo <- "me&you"; foo} at this.
\end{document}

Thsi 创建一个带有非法 LaTeX 字符的 .tex 文件。像这样,

<!-- Preamble omitted for this example. -->
\begin{document}
 Look me&you at this.
\end{document}

我有兴趣得到一个看起来像这样的输出,

<!-- Preamble omitted for this example. -->
\begin{document}
 Look me\&you at this.
\end{document}

很抱歉这个简单的问题,但是有人可以帮助我,也许还有其他人,开始如何修改默认的内联钩子\Sexpr

4

2 回答 2

7

@agstudy 提供的解决方案已经展示了基本思想,这里有一个更健壮的版本:

hook_inline = knit_hooks$get('inline')
knit_hooks$set(inline = function(x) {
  if (is.character(x)) x = knitr:::escape_latex(x)
  hook_inline(x)
})

它仅在内联结果为字符时修改默认内联挂钩(否则仅使用默认挂钩)。我有一个内部函数escape_latex(),希望能正确转义所有特殊的 LaTeX 字符。

于 2012-12-04T07:40:43.330 回答
3

在这种情况下挂钩有效。我像这样自定义它:

inline_hook <- function(x) {
  x <- gsub("\\&", "\\\\&", x)
  x <- gsub("\\$", "\\\\$", x)
  ## good luck for all Latex special character  
  ## $ % _  {  }  &  ~   ^  <  >   |  \ 
}
knit_hooks$set(inline = inline_hook)                    

然后

 knit(input='report.Rnw')      

将重现您的 report.tex。

PS:我认为最好不要让用户做他们想做的事。

于 2012-12-04T02:04:39.300 回答