注意:使用pandoc()
在knitr中时,当尝试将.md或.Rmd编译为PDF时可能会出现错误。
我正在简化可重复性研究的过程,这已经被许多人记录下来。我正在使用pandoc
和knitr
生成优秀的文档。我还试图为一些不太擅长编程的同事简化流程,但我们仍然想要使用类似的文件。有几个“用户友好”的以markdown为中心的编辑器可供选择,出于几个原因,我倾向于使用RStudio(对于他们,对于我来说是emacs/ess,但这是不同的)。
我的工作流程:给他们一个markdown (.md或.Rmd)文件,让他们能够进行更改,并可以重新呈现为PDF。不幸的是,RStudio不允许设置模板或其他任意的pandoc配置参数(例如章节,number-sections),所以在这里使用pandoc()
在R/knitr中是很有意义的。
使用whitepaper.Rmd
作为输入文件,在R中运行pandoc('whitepaper.Rmd', 'pdf')
,立即得到以下结果:
> pandoc('whitepaper.Rmd', 'pdf')
executing pandoc -t latex --standalone --smart --number-sections --template=report.tex -f markdown -t pdf -o whitepaper.pdf "whitepaper.Rmd"
pandoc.exe: cannot produce pdf output with pdf writer
Error in (function (input, format, ext, cfg) : conversion failed
我在knitr特定的头部中明确地加入了"t:latex",但是即使没有它,pandoc()
仍然会向系统调用添加"-t pdf",而这是pandoc.exe
不接受的。
通过故障排除,如果我删除'-t pdf'
,该命令就可以正常工作,因此似乎输入文件本身没有问题:
> system('pandoc -t latex --standalone --smart --number-sections --template=report.tex -f markdown -o whitepaper.pdf "whitepaper.Rmd"')
有很多关于此主题的对话:14586177、14508429、15258233以及广受讨论的11025123。它们都解决了需要命令行工作、额外中间步骤、外部Makefile或者
knit2pdf()
(使用texi2pdf,不是所需)的解决方案。我认为制约条件如下:
- 在R环境中易于操作;
- 利用Yihui的"
<!--pandoc ... -->
"文件配置(例如,使我可以在我的模板之间任意切换); - 最好使用单一的"标准化"命令执行此操作(例如,"
pandoc('whitepaper.Rmd', 'pdf')
")。
我可以打补丁并覆盖Yihui的
knitr:::pandoc_one()
以删除多余的'-t'和格式,但我想知道这可能会在其他地方产生什么副作用。这个解决方案不可持续,也不是"正确的方法(商标)"。有没有解决这个问题的"正确方法(商标)"?我是否漏掉了一种简单/明显的解决方案?
顺便说一句:感谢knitr的作者Yihui Xie和pandoc的作者John MacFarlane。真棒!(也许我可以向其中一个或两个提交补丁建议来解决我的用例,尽管如果只是我一个人,那可能不值得)。
?pandoc
中的ext
选项和明显的文本示例。叹气。谢谢。 - r2evans