Подтвердить что ты не робот

R, Sweave, LaTeX - выходные переменные, которые должны быть напечатаны в LaTeX?

Я искал последние 2 дня, и пока я нашел похожие вопросы о переполнении стека и других обсуждениях в Google, я не нашел ничего, соответствующего моему запросу.

У меня есть уже существующее приложение, которое я поддерживаю, которое построено вокруг файлов шаблонов R. Sweave Rnw, которые используются для генерации файлов .tex, которые используются для генерации файлов .pdf.

Внутри Rnw существует существующий код, например:

\begin{tabular}{lll}
& {\bf \textcolor{TitlesColor}{Report name:}} & \Sexpr{print(myReport$report_name)}\\
& {\bf \textcolor{TitlesColor}{Report date:}} & \today \\
& {\bf \textcolor{TitlesColor}{Course name:}} & \Sexpr{print(myReport$courseInfo$shortname)}\\
& {\bf \textcolor{TitlesColor}{Start date:}}  & \Sexpr{print(myReport$courseInfo$startdate_readable)}\\
& {\bf \textcolor{TitlesColor}{Instructor:}} & \Sexpr{print(paste(myReport$instructor$lastname, collapse="| "))}\\
\end{tabular}

Проблема заключается в том, что myReport $courseInfo $shortname имеет значения, которые должны быть экранированы для LaTeX, так как он включает в себя такие символы, как и (что заставляет LaTeX бросать ошибку о столбцах таблицы). Я попытался включить библиотеку seqinr и использовать stresc для всего объекта данных, но все же сгенерированный файл .tex показывает нераскрытый и от имени.

Я еще не совсем знаком с R, но, играя с шаблоном, я обнаружил, что призывы к "print()" выше даже не нужны, так как просто указывать переменные непосредственно в результатах \Sexpr в печатных значениях, но все же мои экранированные значения не сохраняются при записи в .tex.

Я также попытался поместить stresc непосредственно в \Sexpr (вместо печати) без каких-либо различий.

Таким образом, кажется, что собственный процесс R/Sweave лишает косые черты, что означает, что мне, вероятно, нужны двойные сокращения, но я недостаточно знаком с R, чтобы знать, как это сделать.

Каков правильный способ печати динамических данных в файл .tex?


UPDATE: Основываясь на ответе @Aaron, вот функция, которую я создал:

# Sanitizes variables for displaying within LaTeX via Sexpr
# Adds slashes to LaTeX special characters, which results in single-slash in tex output
sanitizeLatexS <- function(str) {
    gsub('([#$%&~_\\^\\\\{}])', '\\\\\\\\\\1', str, perl = TRUE);
}

Мой обновленный шаблон (как указано в моем первоначальном сообщении выше) теперь выглядит следующим образом:

\begin{tabular}{lll}
& {\bf \textcolor{TitlesColor}{Report name:}} & \Sexpr{sanitizeLatexS(myReport$report_name)}\\
& {\bf \textcolor{TitlesColor}{Report date:}} & \today \\
& {\bf \textcolor{TitlesColor}{Course name:}} & \Sexpr{sanitizeLatexS(myReport$courseInfo$shortname)}\\
& {\bf \textcolor{TitlesColor}{Start date:}}  & \Sexpr{sanitizeLatexS(myReport$courseInfo$startdate_readable)}\\
& {\bf \textcolor{TitlesColor}{Instructor(s):}} & \Sexpr{sanitizeLatexS(paste(myReport$instructorList$lastname, collapse="| "))}\\
\end{tabular}

Итак, строка с и теперь корректно отображается в сгенерированном файле LaTeX как:

Некоторая строка \& некоторая другая строка

4b9b3361

Ответ 1

Вы можете использовать \verb, или вы можете вставить четырехкратную обратную косую черту, которая необходима для ее получения в финальном тексте tex, поскольку она проходит через две операции печати, которые преобразуют двойной "\" в один "\".

\documentclass{article}
\begin{document}
<<echo=FALSE, results=hide>>=
sanitize <- function(str) {
  result <- str
  result <- gsub("&", "\\\\&", result, fixed = TRUE)
  result <- gsub("_", "\\\\_", result, fixed = TRUE)
  result
}
@ 

<<>>=
(foo <- "test & _")
sanitize(foo)
@ 

My string is ``\verb+\Sexpr{foo}+''.  When sanitized, it ``\Sexpr{sanitize(foo)}''.

\end{document}

Ответ 2

Пакет Hmisc имеет функцию latexTranslate, предназначенную для подготовки строк для латекса. Из файла справки:

latexTranslate переводит конкретный элементы в символьных строках в LaTeX формат, например, делает a ^ 2 = a\$^ 2\$для надстрочный индекс в переменных меток. LaTeX имена греческих букв (например, "alpha" ) будут добавлены обратные косые черты если греческая == ИСТИНА. Введен математический режим по мере необходимости. latexTranslate предполагает, что текст ввода всегда имеет совпадения, например. [) [] (](), и что окружение \$\ $в порядке.

Ответ 3

Может ли команда \verb помочь вам?

Ответ 4

Или вы также можете использовать Sweave для создания таблицы; при использовании вывода tex вместо Sexpr требуется только двойная обратная косая черта, как это делает мой sanitize1, или stresc.

Вместо d введите d ваши значения (myReport$report_name вместо "My_Report_Name") вместо тех, которые я составил.

<<echo=FALSE, results=tex>>=
sanitize1 <- function(str) {
  result <- str
  result <- gsub("&", "\\&", result, fixed = TRUE)
  result <- gsub("_", "\\_", result, fixed = TRUE)
  result
}
d <- rbind(c("Report name:","My_Report_Name"),
           c("Report date:","\\today"),
           c("Course name:","STAT101"),
           c("Start date:", "23 Mar 2011"),
           c("Instructor:", "Aaron & Jon L."))
cat("\\begin{tabular}{lll}\n")
for(i in 1:nrow(d)) {
  cat("& {\\textbf{",d[i,1],"}} &", sanitize1(d[i,2]), "\\\\\n", sep="")
}
cat("\\end{tabular}\n")
@