如何用knitr、pandoc从Rmd文件生成期刊TeX投稿ZIP包?
我明白你遇到的痛点——用Rmd(knitr+pandoc+RStudio)写论文时效率拉满,但要凑齐期刊要求的LaTeX源文件zip包就头疼了,原来用纯LaTeX时的Makefile流程完全适配不上。下面给你一套一步步的解决方案,完美衔接你的现有习惯:
原来只加keep_tex: yes不够,得让pandoc别直接把参考文献嵌进tex里,还要生成.aux/.log这些辅助文件,这样你熟悉的texdepend、bibtool才能正常干活:
- 加
citation_package: biblatex(或者natbib,看期刊要求的引用样式选),这样pandoc会在输出的.tex里保留标准的\cite命令,而非直接把参考文献格式好嵌进去 - 保留
keep_tex: true确保生成.tex文件 - 可选指定
latex_engine: pdflatex或xelatex,确保编译过程生成.aux/.log
示例YAML头:
--- title: "你的论文标题" author: "你的名字" output: pdf_document: keep_tex: true citation_package: biblatex latex_engine: pdflatex bibliography: - "../localtexmf/bibtex/bib/statistics.bib" - "../localtexmf/bibtex/bib/graphics.bib" - "../localtexmf/bibtex/bib/Rpackages.bib" biblio-style: authoryear ---
编译后你会得到:your_paper.tex(LaTeX源文件)、your_paper.aux/your_paper.log(辅助文件)、your_paper.bbl/your_paper.blg(参考文献相关文件),这些就是后续工具的“原料”。
期刊只关心你实际引用的文献,没必要把整个大bib包传上去。这里有两种方法:
方法一:用pandoc直接提取
如果已经用knitr生成了.md文件,直接用pandoc命令提取引用过的条目:pandoc your_paper.md --bibliography=../localtexmf/bibtex/bib/statistics.bib --bibliography=../localtexmf/bibtex/bib/graphics.bib --bibliography=../localtexmf/bibtex/bib/Rpackages.bib --output=your_paper_cited.bib这个命令会自动过滤出所有被引用的条目,生成专属的小bib文件。
方法二:用你熟悉的bibtool
现在有了.aux文件,就能用原来的bibtool了,命令如下:bibtool -x your_paper.aux -o your_paper_cited.bib ../localtexmf/bibtex/bib/statistics.bib ../localtexmf/bibtex/bib/graphics.bib ../localtexmf/bibtex/bib/Rpackages.bib它会读取
.aux里的引用标记,从你指定的三个大bib里精准提取需要的条目,完全贴合你之前的习惯。
knitr生成的图默认在figure/目录,但如果还有外部引用的图,或者需要把图单独整理出来:
方法一:用pandoc的
--extract-media参数
在把.md转成.tex时,加这个参数可以把所有引用的图复制到指定目录:pandoc your_paper.md --output=your_paper.tex --keep-tex --extract-media=./figures --bibliography=...(其他必要参数)所有图会被整齐放在
figures/目录,打包时直接拿就行。方法二:用原来的texdepend
现在有了.aux/.log文件,你的texdepend脚本就能正常工作了:texdepend your_paper.tex your_paper.aux your_paper.log > dependencies.txt从生成的
dependencies.txt里提取所有图的路径,复制到打包目录就行。
把上面的步骤整合到Makefile里,替代原来的make zip,一键生成符合要求的zip包:
示例Makefile
# 定义你的文件名 RMDFILE = your_paper.Rmd TEXFILE = your_paper.tex BIBFILE = your_paper_cited.bib FIGDIR = figures ZIPFILE = article.zip # 第一步:编译Rmd生成PDF、.tex、辅助文件 pdf: Rscript -e "rmarkdown::render('$(RMDFILE)', output_format='pdf_document')" # 第二步:提取引用的参考文献 bib: bibtool -x $(TEXFILE:.tex=.aux) -o $(BIBFILE) ../localtexmf/bibtex/bib/statistics.bib ../localtexmf/bibtex/bib/graphics.bib ../localtexmf/bibtex/bib/Rpackages.bib # 第三步:提取所有图文件 figures: mkdir -p $(FIGDIR) pandoc $(RMDFILE:.Rmd=.md) --extract-media=$(FIGDIR) --output=/dev/null # 打包所有期刊需要的文件 zip: pdf bib figures zip -r $(ZIPFILE) \ $(TEXFILE) \ $(TEXFILE:.tex=.pdf) \ $(BIBFILE) \ $(TEXFILE:.tex=.bbl) \ $(FIGDIR)/ \ # 这里可以添加期刊要求的其他文件,比如专属.sty/.cls样式文件、在线补充材料目录等 # 清理临时文件 clean: rm -f $(TEXFILE) $(TEXFILE:.tex=.aux) $(TEXFILE:.tex=.log) $(TEXFILE:.tex=.bbl) $(TEXFILE:.tex=.blg) $(BIBFILE) rm -rf $(FIGDIR)
使用时只需要在终端运行:
make zip
就能自动完成编译、提取参考文献、收集图文件、打包成article.zip的全流程。
最后补充几个小提醒:
- 如果期刊要求用natbib,把YAML里的
citation_package改成natbib就行,bibtool命令依然能用 - 有些期刊对图格式有要求(比如EPS、TIFF),可以在knitr代码块里加
dev="eps"或者dev="tiff"来生成符合要求的图 - 在线补充材料可以单独放在一个子目录里,打包时加到zip命令里就行
内容的提问来源于stack exchange,提问作者user101089

