2011-03-23 21 views
12

He estado buscando durante los últimos 2 días, y aunque he encontrado preguntas similares sobre Stack Overflow y otras discusiones en Google, no he encontrado nada que coincida con mi solicitud.R, Sweave, LaTeX: variables de escape para imprimir en LaTeX?

Tengo una aplicación preexistente que estoy respaldando, que se basa en R. Sweave Rnw Los archivos de plantilla se usan para generar archivos .tex, que se usan para generar archivos .pdf.

Dentro del Rnw, el código no está vigente como este:

\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} 

La cuestión es, MyReport $ CourseInfo $ nombre corto tiene valores que necesitan ser escapado de látex, ya que incluye personajes como & (lo que obliga a LaTeX a arrojar un error sobre las columnas de la tabla). He intentado incluir la biblioteca seqinr y el uso de stresc en todo el objeto de datos, pero el archivo .tex generado muestra un & sin nombre desde shortname.

Aún no estoy totalmente familiarizado con R, pero al jugar con la plantilla, he encontrado que las llamadas a "print()" anteriores ni siquiera son necesarias, como solo especificar las variables directamente dentro de \ Sexpr da como resultado valores impresos, pero aún así mis valores escapados no se guardan cuando se registran en .tex.

También he intentado colocar el stresc directamente dentro de \ Sexpr (en lugar de imprimir), sin ninguna diferencia.

Parece que el propio proceso de R/Sweave está eliminando las barras diagonales, lo que significa que probablemente necesite duplicar los valores, pero no estoy lo suficientemente familiarizado con R para saber cómo hacerlo.

¿Cuál es la forma correcta de imprimir datos dinámicos en un archivo .tex?


ACTUALIZACIÓN: Sobre la base de @ respuesta de Aaron, aquí es la función que creé:

# 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); 
} 

Mi plantilla actualizada (como se hace referencia en mi post original arriba) ahora se ve así:

\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} 

Así que una cadena con & ahora aparece correctamente en el archivo LaTeX generado como:

Algunos cadena \ & alguna otra cadena

Respuesta

8

Puede usar \verb o puede insertar una barra invertida cuádruple, que es necesaria para obtener una en el archivo tex final porque atraviesa dos operaciones de impresión que convierten un doble "\" en una sola "\".

\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's ``\Sexpr{sanitize(foo)}''. 

\end{document} 
+0

Solución similar en la lista de correo de R-help: http://stat.ethz.ch/pipermail/r-help/2010-November/260082.html – Aaron

+0

lista de correo url da a 404 –

+0

Para aclarar tu comentario sobre \ verb (tu comentario en la respuesta de Andrea), para obtener "Some text with & included" impreso en tex como "Some text with \ & included", haría esto? '\ verb + \ Sexpr {myReport $ courseInfo $ shortname} + ' –

1

¿Puede el \verb orden help?

+0

no estoy seguro. ¿Me lo utilizan como \ verb \ Sexpr {stresc (MyReport $ $ CourseInfo nombre corto)}? –

+0

Debe especificar los delimitadores de inicio/final que no están en su expresión. Los más comunes son '|' o '+'. Tampoco necesita el 'stresc'. De esta manera:' \ verb + \ Sexpr {myReport $ courseInfo $ shortname} + '. – Aaron

0

O también podría usar Sweave para hacer la tabla; cuando se usa la salida tex en lugar de Sexpr, solo se necesita una barra diagonal inversa doble, como hace sanitize1 aquí, o stresc de forma más completa.

Rellene d con sus valores (myReport$report_name en lugar de "My_Report_Name", por ejemplo) en lugar de los que inventé.

<<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") 
@ 
7

El paquete Hmisc tiene una función latexTranslate diseñado para preparar cadenas de látex. Desde su archivo de ayuda:

latexTranslate traduce particulares artículos en cadenas de caracteres al látex formato, por ejemplo, hace a^2 = a \ $^2 \ $ para superíndice dentro de las etiquetas de variable. Los nombres LaTeX de las letras griegas (por ejemplo, "alfa") tendrán barras invertidas añadidas si greek == TRUE. El modo matemático se inserta según sea necesario. latexTranslate asume que el texto de entrada siempre tiene coincidencias, p. [) [] (](), y que rodea por \ $ \ $ está bien.

+0

¡Gracias, no sabía de eso! Sin embargo, parece que solo agrega dos barras diagonales inversas, por lo que funcionaría en la salida 'tex' pero no en la de' Sexpr'. – Aaron