在 Rstudio 中合并 rmarkdown 生成的 latex 文档,而无需手动删除序言
Combine rmarkdown generated latex documents in Rstudio without having to manually delete preambles
问题:
我有几个 Rmarkdown 文档代表我论文的不同部分(例如第 1 章结果,第 2 章结果),我想将这些文档的编织乳胶版本与其他 TeX 文件组合成一个主 TeX 'thesis' 文档。问题是,当编织成 PDF 并将 TeX 文件包含在主 TeX 文档中时,Rstudio auto-generates 一堆序言最终与我在 master.TeX 文档中的序言发生冲突。
不太理想的解决方法:
我一直在解决这个问题,方法是在将针织输出包含到 master.tex
文件之前手动删除此序言。
目前我的工作流程如下:
- 在 YAML header 中将输出设置为 pdf_document,并将 keep_tex 选项设置为 true。
- knitPDF 使用 Rstudio 按钮
- 手动删除编织的 TeX 文件开头的序言。
- 使用 \include{}
将文件包含到我的 master.tex 文件中
问题:
我想将 Rmd 转换为 LaTeX,而不必在将编织的 TeX 文件包含到主 TeX 文件之前手动删除序言。我该怎么做?
摆动不是一种选择:
我确信我可以通过使用 Sweave 来实现这一点,但是我喜欢 Rmarkdown 提供的输出格式的灵活性:我可以编成 html 并在我写作时在浏览器中查看,可以快速查看自己的工作进度,确保没有bug,还可以选择knit to word分享给只在word工作的主管。然后,当我准备好将所有内容编译到我的主 LaTeX 文档中进行打印时,我可以 select 在 Rstudio 中编织成 PDF 以获得乳胶输出。
我想出了一个解决方法:
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
标志。这会生成一个 'standalone' 文档,即包含乳胶序言的文档。当你想查看PDF时,这显然是必需的,但与我的需求冲突。
我正在寻求使用 knitr 从 Rmd
生成乳胶 'fragment',稍后可以将其合并到我的主乳胶文件中。所以解决方案只是创建一个省略 -s
独立标志的 pandoc 命令行调用。我通过在上述函数中使用 system()
从 R 调用 pandoc 来实现这一点。
希望这可以帮助遇到此问题的任何人,但如果我能够更改 Rstudio 的设置以避免打扰这个 hack,那就太好了。欢迎提出建议和反馈。
这是一个使用 LaTeX 包的更简单的解决方案 docmute
。
您的主要 Rmarkdown 文档(例如,main.Rmd
)应该加载 docmute
包并包含您的其他文件(例如,part1.Rmd
和 part.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
那么你需要做的就是在main.Rmd
之前编织part*.Rmd
,所有内容都会出现在main.tex
和main.pdf
中。 docmute
包从输入 .tex
文件中删除了前导码,因此您需要确保在输入文件 \begin{docunent}
之前您需要的任何内容也在 main.Rmd
.[= 中29=]
问题:
我有几个 Rmarkdown 文档代表我论文的不同部分(例如第 1 章结果,第 2 章结果),我想将这些文档的编织乳胶版本与其他 TeX 文件组合成一个主 TeX 'thesis' 文档。问题是,当编织成 PDF 并将 TeX 文件包含在主 TeX 文档中时,Rstudio auto-generates 一堆序言最终与我在 master.TeX 文档中的序言发生冲突。
不太理想的解决方法:
我一直在解决这个问题,方法是在将针织输出包含到 master.tex
文件之前手动删除此序言。
目前我的工作流程如下:
- 在 YAML header 中将输出设置为 pdf_document,并将 keep_tex 选项设置为 true。
- knitPDF 使用 Rstudio 按钮
- 手动删除编织的 TeX 文件开头的序言。
- 使用 \include{} 将文件包含到我的 master.tex 文件中
问题:
我想将 Rmd 转换为 LaTeX,而不必在将编织的 TeX 文件包含到主 TeX 文件之前手动删除序言。我该怎么做?
摆动不是一种选择:
我确信我可以通过使用 Sweave 来实现这一点,但是我喜欢 Rmarkdown 提供的输出格式的灵活性:我可以编成 html 并在我写作时在浏览器中查看,可以快速查看自己的工作进度,确保没有bug,还可以选择knit to word分享给只在word工作的主管。然后,当我准备好将所有内容编译到我的主 LaTeX 文档中进行打印时,我可以 select 在 Rstudio 中编织成 PDF 以获得乳胶输出。
我想出了一个解决方法:
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
标志。这会生成一个 'standalone' 文档,即包含乳胶序言的文档。当你想查看PDF时,这显然是必需的,但与我的需求冲突。
我正在寻求使用 knitr 从 Rmd
生成乳胶 'fragment',稍后可以将其合并到我的主乳胶文件中。所以解决方案只是创建一个省略 -s
独立标志的 pandoc 命令行调用。我通过在上述函数中使用 system()
从 R 调用 pandoc 来实现这一点。
希望这可以帮助遇到此问题的任何人,但如果我能够更改 Rstudio 的设置以避免打扰这个 hack,那就太好了。欢迎提出建议和反馈。
这是一个使用 LaTeX 包的更简单的解决方案 docmute
。
您的主要 Rmarkdown 文档(例如,main.Rmd
)应该加载 docmute
包并包含您的其他文件(例如,part1.Rmd
和 part.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
那么你需要做的就是在main.Rmd
之前编织part*.Rmd
,所有内容都会出现在main.tex
和main.pdf
中。 docmute
包从输入 .tex
文件中删除了前导码,因此您需要确保在输入文件 \begin{docunent}
之前您需要的任何内容也在 main.Rmd
.[= 中29=]