在Sweave文档中插入手动创建的降价表

时间:2016-02-23 16:58:22

标签: r latex markdown knitr sweave

我在markdown中有一堆相当大的表,我是手动创建的。我在Rmd文档中使用它们。由于我需要更多控制LaTeX和所有,我使用Rnw文档。如何将我的降价表放在Sweave文件中?

下面是一个最小的例子(不工作):

\documentclass{article}

\begin{document}
\SweaveOpts{concordance=TRUE}

% my markdown table

col1 | col2 | col3
------|:---:|:---:
row1 | cell1 | cell2 
row2 | cell3 | cell4 
row3 | cell5 | cell6 


\end{document}

我试图转换文档中的表格,只是将表格粘贴在Sweave文档中的markdown中,然后在LaTeX中渲染它。我尝试产生错误,但我更接近:

\documentclass{article}

\begin{document}
\SweaveOpts{concordance=TRUE}

<<texifytable, echo=FALSE, results=tex>>=
mytab = sprintf("col1 | col2 | col3
------|:---:|:---:
row1 | cell1 | cell2 
row2 | cell3 | cell4 
row3 | cell5 | cell6")
system2("pandoc", args = c("-f markdown","-t latex"),
        stdout = TRUE, input = mytab)
@

\end{document}

1 个答案:

答案 0 :(得分:1)

可行:

\documentclass{article}
\usepackage{longtable}
\usepackage{booktabs}
\begin{document}

<<echo = FALSE, results = "asis", message = FALSE>>=
library(knitr)

markdown2tex <- function(markdownstring) {
  writeLines(text = markdownstring,
             con = myfile <- tempfile())
  texfile <- pandoc(input = myfile, format = "latex", ext = "tex")
  cat(readLines(texfile), sep = "\n")
  unlink(c(myfile, texfile))
}

markdowntable <- "
col1 | col2 | col3
-----|:----:|:----:
row1 | cell1 | cell2
row2 | cell3 | cell4
row3 | cell5 | cell6
"

markdown2tex(markdowntable)
@
\end{document}

我将代码包装在一个小帮助函数markdown2tex中。当使用多个降价表时,这会使代码非常小。

想法是简单地复制文档中的markdown表并将其作为字符串分配给对象(此处为:markdowntable)。将markdowntable传递给markdown2tex包含等效的LaTeX表到文档中。不要忘记使用块选项results = "asis"message = FALSE(后者以禁止来自pandoc的邮件)。

markdown2tex中的主力是knitr::pandoc。使用format = "latex", ext = "tex",它将input转换为TEX片段,并返回TEX文件(texfile)的路径。由于pandoc需要文件名作为输入,因此markdown字符串将写入临时文件myfile。将texfile的内容打印到文档后,myfiletexfile将被删除。

当然,如果降价表已经保存在文件中,则可以简化这些步骤。但就个人而言,我喜欢在 RNW文件中添加markdown字符串的想法。这样,它可以轻松编辑,内容清晰,并支持可重复性。

注意:您需要在序言中添加\usepackage{longtable}\usepackage{booktabs}。由pandoc生成的TEX代码需要这些包。

上面的示例生成以下输出:

enter image description here