R,Sweave,LaTeX-要在LaTeX中打印的转义变量? [英] R, Sweave, LaTeX - escape variables to be printed in LaTeX?

查看:71
本文介绍了R,Sweave,LaTeX-要在LaTeX中打印的转义变量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

过去2天我一直在搜索,虽然我在Stack Overflow和Google的其他讨论中发现了类似的问题,但没有找到符合我要求的内容.

I've been searching for the past 2 days, and while I've found similar questions on Stack Overflow and other discussions on Google, I've found nothing matching my request.

我有一个支持R的预先存在的应用程序,它是围绕R构建的.Sweave Rnw模板文件用于生成.tex文件,该文件用于生成.pdf文件.

I have a pre-existing application that I'm supporting, which is built around R. Sweave Rnw template files are used to generate .tex files, which are used to generate .pdf files.

在Rnw中,有这样的现有代码:

Within the Rnw, there is existing code such as this:

\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文件仍然显示不加斜线&来自简称.

The issue is, myReport$courseInfo$shortname has values that need to be escaped for LaTeX, as it includes characters such as & (which forces LaTeX to toss an error about the table columns). I've attempted including the seqinr library, and using stresc on the entire data object, but still the generated .tex file shows an unslashed & from shortname.

我还不完全了解R,但是在处理模板时,我发现甚至不需要调用上面的"print()",因为直接在\ Sexpr结果中指定了变量在打印值中,但是当记录在.tex中时,我的转义值仍然未被转义.

I'm not wholly familiar with R yet, but in playing around with the template, I've found that the calls to "print()" above are not even needed, as just specifying the variables directly within \Sexpr results in printed values, but still my escaped values are unescaped when recorded in the .tex.

我还尝试将stresc直接放在\ Sexpr(而不是print)中,没有区别.

I've also attempted to place stresc directly within the \Sexpr (instead of print), with no difference.

因此,似乎R/Sweave自己的过程正在去除斜杠,这意味着我可能需要对斜杠值进行双斜杠,但是我对R并不十分了解,所以不知道该怎么做.

So it seems that R/Sweave's own process is stripping the slashes, which means I likely need to double-slash values, but I'm not familiar enough with R to know how to do that.

将动态数据打印到.tex文件中的正确方法是什么?

What is the proper way to print dynamic data into a .tex file?

更新: 根据@Aaron的响应,这是我创建的函数:

UPDATE: Based on @Aaron's response, here is the function I created:

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

我更新后的模板(如上面我的原始帖子所引用的)现在看起来像这样:

My updated template (as referenced in my original post above) now looks like this:

\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文件中显示为:

So a string with an & now properly shows up in the generated LaTeX file as:

某些字符串\&其他一些字符串

Some string \& some other string

推荐答案

您可以使用\verb,也可以插入一个四倍的反斜杠,在最后的tex文件中需要一个反斜杠,因为它要经历两次打印操作将双"\"转换为单个"\".

You can either use \verb or you can insert a quadruple backslash, which is needed to get one in the final tex file because it goes through two printing operations which convert a double "\" to a single "\".

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

这篇关于R,Sweave,LaTeX-要在LaTeX中打印的转义变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆