在Rstudio中组合rmarkdown生成的乳胶文档,而无需手动删除前导

时间:2015-07-31 11:01:04

标签: latex rstudio knitr r-markdown pandoc

问题:

我有几个代表论文不同部分的Rmarkdown文档(例如第1章结果,第2章结果),我想将这些文档的针织乳胶版本与其他TeX文件合并到一个主TeX'论文'文献。问题是,当编织为PDF并保持TeX文件包含在主TeX文档中时,Rstudio会自动生成一串前导,最终与master.TeX文档中的前导冲突。

不太理想,解决方法:

我一直在解决这个问题,在将编织的输出包含到master.tex文件之前,手动删除此序言。

到目前为止,我目前的工作流程如下:

  • 将输出设置为YAML标头中的pdf_document,并将keep_tex选项设置为true。
  • knitPDF使用Rstudio按钮
  • 手动删除编织TeX文件开头的序言。
  • 使用\ include {}
  • 将文件包含到我的master.tex文件中

问题:

我想将Rmd转换为LaTeX,而不必在将编织的TeX文件包含到主TeX文件之前手动删除前导码。我该怎么做?

Sweave不是一个选项:

我确信我可以通过使用Sweave来实现这一目标,但我喜欢Rmarkdown提供的输出格式的灵活性:我可以编织为html并在我的浏览器中查看,因为我正在写作,以便快速查看我的工作进度并确保没有错误,我也可以选择编织单词与我的主管分享,该主管只能用语言表达。然后,当我准备将所有内容编译到我的主LaTeX文档中进行打印时,我可以在Rstudio中选择编织为PDF以获得乳胶输出。

2 个答案:

答案 0 :(得分:2)

以下是使用LaTeX软件包docmute的更简单的解决方案。

您的主要Rmarkdown文档(例如main.Rmd)应该加载docmute包并包含您的其他文件(例如part1.Rmdpart.Rmd),一旦编织并且位于同一目录中,\input\include如下:

---
title: "Main"
output: pdf_document 
header-includes:
- \usepackage{docmute}
---
# Part 1
\input{part1.tex}
# Part 2
\input{part1.tex}

然后你的其他文件只需要在YAML前面有一个keep_tex参数。像这样:

---
title: "Part 1"
output: 
  pdf_document:
    keep_tex: true
---

Something

和此:

---
title: "Part 2"
output: 
  pdf_document:
    keep_tex: true
---

Something else

然后您需要做的就是在part*.Rmd之前编织main.Rmd,并且所有内容都会显示在main.texmain.pdf中。 docmute包会从输入.tex文件中删除前导码,因此您需要确保输入文件中的\begin{docunent}之前所需的任何内容都在main.Rmd中。

答案 1 :(得分:1)

我已经想出了一个解决方法:

create_latex <- function(f){
  knitr::knit(f, 'tmp-outputfile.md');
  newname <- paste0(tools::file_path_sans_ext(f), ".tex")
  mess <- paste('pandoc -f markdown -t latex -p -o', shQuote(newname),"tmp-outputfile.md")
  system(mess)}

上面的函数将Rmd文件作为输入,将文件编织为md,然后通过从命令行调用pandoc将其转换为TeX

秘密成分在于pandoc调用...当使用Rstudio编织时,Rstudio在编译pdf时必须调用pandoc独立-s标志。这将生成一个“独立”文档,即包含乳胶前导码的文档。当您想要查看PDF时,这显然是必要的,但与我的需求相冲突。

我正在尝试使用knitr从Rmd生成一个乳胶'片段',以后可以将其合并到我的主Latex文件中。因此,解决方案只是创建一个省略-s独立标志的pandoc命令行调用。我通过在上面的函数中使用system()从R调用pandoc来实现这一点。

希望这可以帮助那些有这个问题的人,但如果我能够改变Rstudio的设置以避免烦扰这个黑客,那将会很棒。建议和反馈欢迎。