\Sexpr{} специальные символы LaTeX ($, &, %, # и т. д.) в .Rnw-файле

Это как-то связано со встроенным хуком по умолчанию, я это понимаю, и я попытался добраться до него (хука), а также прочитать эта тема и страница Yihui о ловушки, но я не смог решить свою проблему. Я даже попробовал это предложение от Саши Эпскампа, но в моем случае это не помогло.

Я использую \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}

Это создает файл .tex с недопустимым символом LaTeX. Так,

<!-- 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?


person Eric Fail    schedule 04.12.2012    source источник
comment
почему вы не можете привести воспроизводимый пример? Я действительно не понимаю, зачем вам хук \Sexpr?   -  person agstudy    schedule 04.12.2012
comment
@agstudy, спасибо за ваш комментарий и извините, что не предоставил воспроизводимый пример. Если у меня есть объект R, который равен (foo <- "me&you"), и вы передаете его \Sexpr{foo}, .tex-файл заканчивается символом & без ` and it should have been \&`. Я постараюсь сделать воспроизводимый пример.   -  person Eric Fail    schedule 04.12.2012
comment
И отредактируйте свой вопрос, пожалуйста, лучше, чем помещать его в комментарий.   -  person agstudy    schedule 04.12.2012
comment
@agstudy, я обновил свой вопрос. Спасибо за ваш отзыв!   -  person Eric Fail    schedule 04.12.2012
comment
Я удивлен, что дословная идея Саши не сработала. Это кажется правильным, а не добавлять обратную косую черту перед всеми специальными символами.   -  person Aaron left Stack Overflow    schedule 04.12.2012
comment
@Aaron Аарон, да, это потрясающе, но команда \verb в этом случае не работает.   -  person agstudy    schedule 04.12.2012
comment
@agstudy @Aaron Я также очень удивлен, что \verb|\Sexpr{'me&you'}| не работает у вас, но у меня работает с TeXLive 2012 под Ubuntu, а также с MikTeX 2.9 под Windows. Возможно, это проблема LaTeX? Сначала обновить пакеты LaTeX?   -  person Yihui Xie    schedule 04.12.2012
comment
@Yihui у меня работает после обновления. Благодарю.   -  person agstudy    schedule 04.12.2012
comment
@Yihui, @Aaron +agstudy Спасибо за вашу помощь и отзывы. Скорее всего, это моя установка LaTeX. У меня TeX Live 2009/Debian.   -  person Eric Fail    schedule 04.12.2012


Ответы (2)


Решение, предоставленное @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.

person Yihui Xie    schedule 04.12.2012
comment
Это сработало, когда я вязала с помощью кнопки RStudio. Когда я использую драйвер rscript для перебора различных наборов данных, все мои цифры не отображаются. Вместо этого я вижу название их латексной этикетки. Я использую для вязания2pdf в скрипте драйвера. Как бы у нас была та же функциональность, но с запуском Knit2pdf? - person Sahir Moosvi; 30.10.2018
comment
Это позволяет мне использовать встроенные каналы, и это здорово. Но я получаю сообщение об ошибке: неожиданный ввод в \ для каждого выражения с этими экранированными символами. Есть ли способ справиться с этим? - person Sahir Moosvi; 29.11.2018

Перехват в этом случае работает. Я настраиваю это так:

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: я думаю, что лучше не позволять пользователям делать то, что они хотят.

person agstudy    schedule 04.12.2012