Sweave:如何在 Soutput 环境中删除水平空间?

Sweave:如何在 Soutput 环境中删除水平空间?

如下例所示,环境中添加了一个水平空格Soutput。这会导致输出不左对齐(参见 的输出)rnorm()。我发现这个空格在“标准 R 输出”(交互模式下)中已经存在,问题是能否以某种方式避免它?

\documentclass{article}

\usepackage[american]{babel}
\usepackage{fancyvrb}
\usepackage{Sweave}

\begin{document}
\noindent Just some text before the chunk
<<foo>>=
set.seed(1)
rnorm(10)
3 != 4
@
Just some text after the chunk
\end{document}

答案1

这可能不是一个真正的 LaTeX 问题——正如您所提到的,R 输出中存在空格,并且它不是由环境引起的Soutput

在输出中添加空格的原因是您要打印 10 个数字,并且 R 必须保留一个空格以确保所有行的对齐良好,例如输出可能[10]在最后一行有一个潜在索引,其中有两个字符,而前面的索引只有一个字符,例如[1],,[2]...

请注意,随着向量中元素数量的增加,空格的数量也会增加:

> options(width = 30)
> 1  # no space
[1] 1
> 1:10
 [1]  1  2  3  4  5  6  7  8
 [9]  9 10
> 1:20
 [1]  1  2  3  4  5  6  7  8
 [9]  9 10 11 12 13 14 15 16
[17] 17 18 19 20
> 1:100  # two spaces now
  [1]   1   2   3   4   5   6
  [7]   7   8   9  10  11  12
 [13]  13  14  15  16  17  18
 [19]  19  20  21  22  23  24
....

有一个解决方案,如果你使用knitr包裹而不是 Sweave。基本思路是使用输出钩子函数

\documentclass{article}

<<setup, include=FALSE>>=
# modify the default hook to remove spaces before writing output
hook_output = knit_hooks$get('output')
knit_hooks$set(output = function(x, options) {
  s = options$rm.spaces
  if (!is.null(s)) x = gsub(sprintf('(^|\n)%s', s), '\\1', x)
  hook_output(x, options)
})
@

\begin{document}
\noindent Just some text before the chunk
<<foo, comment=NA, rm.spaces=' '>>=
set.seed(1)
rnorm(10)
3 != 4
@
Just some text after the chunk
\end{document}

要编译该文档,请使用library(knitr); knit('yourfile.Rnw')而不是Sweave('yourfile.Rnw')

相关内容