2010-08-30 91 views
3

在我进行的一项调查结束时,我们向受访者提供了一个开放式框,告诉我们在调查中没有涉及的任何内容。这些评论通常会跨越多页。我熟悉longtable包乳胶和这里的解决方案,我已经嘲笑了:打印长字符串文本LaTeX/Sweave

<<results = tex>>= 
cat("\\begin{longtable}{p{14cm}}\n") 
cat("\\hline\n") 
write.table(toBePrinted, eol = "\\\\\n", col.names = FALSE) 
cat("\\hline\n") 
cat("\\end{longtable}") 
@ 

虽然这种解决方案在技术上的作品,它看起来并不可怕打磨,需要加以改进。我有两个相关的问题:

  1. Sweave输出的文本卫生技巧要被视为tex。例如,如果有人说通过LaTeX处理Your survey is awesome & I would take more surveys for $$$ 100% of the time!特殊字符&, $, % reak havok。有没有比gsub调用列表更有效率的东西来替换有害的角色?
  2. 关于使用Sweave & LaTeX更好地打印这些长评论的建议。

回答

2

你可以看看用于创建乳胶表的软件包xtable,但是这并不适用于我猜想的longtable。或者,查看包Hmisc中的函数latex,该函数具有“longtable”选项并允许对输出进行更多控制。

要添加斜线特殊字符,如乳胶使用,你可以做这样的事情:

add.slash <- function(x){ 
    where <- embed(c(1,gregexpr("[&#$%]",x)[[1]],nchar(x)+1),dim=2) 
    out <- paste(apply(where,1,function(y){substr(x,y[2],y[1]-1)}),collapse="\\") 
    return(out) 
} 

> x <- "I print $ and % and & and # and . and ! and ," 

> cat(add.slash(x),"\n") 
I print \$ and \% and \& and \# and . and ! and , 

编辑: 使用[[:PUNCT:]是错误的,也改变标点符号等等。代码已更正。反斜杠确实存在问题。

+1

正如您所指出的,'xtable'不能很好地处理跨越多个页面的表格。我使用'xtable'为报表的其余部分生成LaTeX格式的表格。我将不得不看看Hmisc包,看看我能不能找到一些工作。 'add.slash'函数将按照它应该的那样工作。谢谢〜 – Chase 2010-08-30 17:58:35