3

これはデフォルトのインラインフックと関係があります。私はそれ(フック)を試してみて、このスレッドとフックに関するYihuiのページを読んでみましたが、問題を解決できませんでした。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 に答える