【问题标题】:Insert manually created markdown table in Sweave document在 Sweave 文档中插入手动创建的降价表
【发布时间】:2016-06-05 15:31:36
【问题描述】:

我在 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}

【问题讨论】:

  • 如果使用 LaTeX,那么您必须先将手动创建的降价表转换为 TeX,例如通过 pandoc,因为pdflatex 不知道降价。
  • 感谢@daroczig 的回答 好的,我认为可以从 Rnw 文件中调用 pandoc/pander 将表格从 markdown 转换为 TeX。
  • 其实你可以尝试用 pandoc 的 markdown reader 和 latex writer pandoc myfile.tex -f markdown -t latex -o myfile_transformed.tex 来解析它。 Pandoc 应该不变地传递所有乳胶命令,并转换表格。 (这显然只适用于你的第一个例子)

标签: r latex markdown knitr sweave


【解决方案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 中。这使得代码在与多个降价表一起使用时非常精简。

这个想法是简单地复制文档中的降价表并将其作为字符串分配给一个对象(这里:markdowntable)。将 markdowntable 传递给 markdown2tex 会将等效的 LaTeX 表包含到文档中。不要忘记使用块选项results = "asis"message = FALSE(后者是为了抑制来自pandoc 的消息)。

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

当然,如果markdown表已经保存在文件中,这些步骤可以简化。但就个人而言,我喜欢在 RNW 文件中 in 使用 markdown 字符串的想法。这样,它可以很容易地编辑,内容清晰并且支持再现性。

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

上面的例子产生以下输出:

【讨论】:

  • 谢谢@cl!它就像一个魅力。我也同意在 Rnw 文件本身中包含降价表非常方便,因为您指出了易于编辑和可再现性的原因。也感谢您的精彩解释,它非常完整且很有帮助。
  • @JoséManuelMartínezMartínez 很高兴它有帮助。我想知道这个功能能走多远……还没有检查它是否也适用于更大的 Rmarkdown 块。
猜你喜欢
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多