【问题标题】:\Sexpr{} special LaTeX characters ($, &, %, # etc.) in .Rnw-file\Sexpr{} .Rnw 文件中的特殊 LaTeX 字符($、&、%、# 等)
【发布时间】:2012-12-04 00:06:53
【问题描述】:

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

我正在使用\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 的默认内联挂钩?

【问题讨论】:

  • 为什么你没有给我们一个可重现的例子?我真的不明白你为什么要挂钩 \Sexpr?
  • @agstudy,感谢您的评论,很抱歉没有提供可重复的示例。如果我有一个 R 对象 (foo &lt;- "me&amp;you") 并传递给你 \Sexpr{foo} ,则 .tex 文件以 & 结尾,而没有 ` and it should have been \&`。我将尝试制作一个可重现的示例。
  • 请编辑您的问题,而不是将其放在评论中。
  • @agstudy,我已经更新了我的问题。感谢您的反馈。
  • 我很惊讶 Sacha 的逐字逐句的想法没有奏效。这似乎是正确的做法,而不是在所有特殊字符之前添加反斜杠。

标签: r latex knitr


【解决方案1】:

@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 字符。

【讨论】:

  • 这在我使用 RStudio 按钮编织时有效。当我使用驱动程序 rscript 遍历不同的数据集时,我的所有数字都不会显示。相反,我看到了他们的乳胶标签名称。我在驱动程序脚本中使用 knit2pdf。我们如何拥有相同的功能但运行 knit2pdf?
  • 这让我可以使用管道内联,这很棒。但是我收到一条消息,提示错误:带有这些转义字符的每个表达式的“\”中出现意外输入。有办法处理吗?
【解决方案2】:

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

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:我认为最好不要让用户为所欲为。

【讨论】:

    猜你喜欢
    • 2016-06-11
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 2016-12-14
    • 2010-11-09
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多