【发布时间】:2012-02-12 17:34:31
【问题描述】:
我想在生成的 pdf 中将一个 R 代码块(在 Sweave 中)打印在一个带框的框中。
有没有简单的解决方案?
【问题讨论】:
我想在生成的 pdf 中将一个 R 代码块(在 Sweave 中)打印在一个带框的框中。
有没有简单的解决方案?
【问题讨论】:
简短的回答是,是的,有一个简单的方法。只需在 Sweave 文档的序言中添加以下行或类似内容:
\DefineVerbatimEnvironment{Sinput}{Verbatim} {xleftmargin=2em,
frame=single}
\DefineVerbatimEnvironment{Soutput}{Verbatim}{xleftmargin=2em,
frame=single}
这是可行的,因为代码(和输出)块的外观由Sinput 和Soutput 环境的定义控制。这些都是由 LaTeX 包fancyvrb 提供的Verbatim 环境。 (Click here 的 73 页 pdf 描述了fancyvrb 提供的众多选项)。
快速查看文件Sweave.sty 会发现这两个环境的默认定义:
\DefineVerbatimEnvironment{Sinput}{Verbatim}{fontshape=sl}
\DefineVerbatimEnvironment{Soutput}{Verbatim}{}
\DefineVerbatimEnvironment{Scode}{Verbatim}{fontshape=sl}
要更改这些定义,只需添加您自己设计的\DefineVerbatimEnvironment 语句: (a) 在Sweave.sty 文件的末尾;或 (b) 在您的 *.Snw 文档的开头。
最后,这里有一个例子来展示它在实践中的样子:
\documentclass[a4paper]{article}
\usepackage{Sweave}
\DefineVerbatimEnvironment{Sinput}{Verbatim} {xleftmargin=2em,
frame=single}
\DefineVerbatimEnvironment{Soutput}{Verbatim}{xleftmargin=2em,
frame=single}
\title{Sweave with boxes}
\begin{document}
\maketitle
<<echo=FALSE>>=
options(width=60)
@
Here is an example of a code chunk followed by an output chunk,
both enclosed in boxes.
<<>>=
print(rnorm(99))
@
\end{document}
【讨论】:
Sinput、Soutput 和 Scode,这似乎并不容易。Hacking Sweave 总是一个巨大的痛,这就是为什么一辉做knitr的原因,现在我已经用了几年了,我无法想象再回头!
knitr,Sweave 的后继者,默认情况下输出所有回显的 R 代码在框中,并将其格式化为边缘。其他不错的功能包括语法着色和 PGF 集成。
Sweave 平均复杂度的代码只需要很小的修改即可与knitr 一起运行。
【讨论】: