\ Sexpr {} .Rnw文件中的特殊LaTeX字符($,&,%,#等)

时间:2012-12-04 00:06:54

标签: r latex knitr

它与默认的内联钩子有关,我意识到这一点,我已经尝试了它(钩子),还读了this thread和Yihui的page about hooks,但我还没有能够解决我的问题。我甚至尝试过来自Sacha Epskamp的this suggestion,但在我的情况下它并没有这样做。

我正在使用\Sexpr并按照\Sexpr{load("meta.data.saved"); meta.data[1,7]}的方式执行某些操作来在我的报告中打印关键字,问题是撰写这些关键字的人(我无法控制的人)正在使用特殊的乳胶字符($,&,%,#等)以及它们传递到我的.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的默认内联挂钩?

2 个答案:

答案 0 :(得分: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字符。

答案 1 :(得分: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:我认为最好不要让用户做他们想做的事。