12

過去 2 日間検索してきましたが、Google で Stack Overflow やその他のディスカッションで同様の質問を見つけましたが、私の要求に一致するものは見つかりませんでした。

私がサポートしている既存のアプリケーションは、R を中心に構築されています。Sweave Rnw テンプレート ファイルは、.pdf ファイルの生成に使用される .tex ファイルの生成に使用されます。

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 ファイルには、スラッシュなしの & from shortname が表示されます。

私はまだ R に完全に精通しているわけではありませんが、テンプレートをいじってみると、\Sexpr 内で変数を直接指定するだけで値が出力されるため、上記の "print()" の呼び出しすら必要ないことがわかりました。 、しかし、.texに記録すると、エスケープされた値はエスケープされません。

また、stresc を (print ではなく) \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 ファイルに次のように正しく表示されるようになりました。

いくつかの文字列 \& 他の文字列

4

4 に答える 4

8

\verb4 つのバックスラッシュを使用するか、挿入することができます。これは、2 つの「\」を 1 つの「\」に変換する 2 つの印刷操作を行うため、最終的な tex ファイルで 1 つを取得するために必要です。

\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}
于 2011-03-23T15:08:17.190 に答える
7

このHmiscパッケージには、latexTranslateLatex 用の文字列を準備するように設計された関数があります。そのヘルプファイルから:

latexTranslate は、文字列内の特定の項目を LaTeX 形式に変換します。たとえば、変数ラベル内の上付き文字を a^2 = a\$^2\$ にします。ギリシャ文字 (例: "alpha") の LaTeX 名には、greek==TRUE の場合、バックスラッシュが追加されます。必要に応じて演算モードが挿入されます。latexTranslate は、入力テキストが常に一致するもの、たとえば [) [] (] () を想定しており、\$\$ で囲んでも問題ありません。

于 2011-03-23T16:45:02.690 に答える
1

\verbコマンドは役に立ちますか?

于 2011-03-23T13:58:24.593 に答える
0

または、Sweave を使用してテーブルを作成することもできます。myがここで行っているように、またはより完全に行っているように、二重のバックスラッシュだけが必要なtex代わりに出力を使用する場合。Sexprsanitize1stresc

私が作成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")
@ 
于 2011-03-23T15:53:41.690 に答える