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 как:
Некоторая строка \& некоторая другая строка
Ответы
Ответ 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")
@