knitr pandoc:“无法使用pdf writer生成pdf输出”

4

注意:使用pandoc()在knitr中时,当尝试将.md或.Rmd编译为PDF时可能会出现错误。

我正在简化可重复性研究的过程,这已经被许多人记录下来。我正在使用pandocknitr生成优秀的文档。我还试图为一些不太擅长编程的同事简化流程,但我们仍然想要使用类似的文件。有几个“用户友好”的以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"')

有很多关于此主题的对话:145861771450842915258233以及广受讨论的11025123。它们都解决了需要命令行工作、额外中间步骤、外部Makefile或者knit2pdf()(使用texi2pdf,不是所需)的解决方案。
我认为制约条件如下:
  • 在R环境中易于操作;
  • 利用Yihui的"<!--pandoc ... -->"文件配置(例如,使我可以在我的模板之间任意切换);
  • 最好使用单一的"标准化"命令执行此操作(例如,"pandoc('whitepaper.Rmd', 'pdf')")。
...因此,一旦在文件中设置了参数,编辑和重新渲染就相对容易。
我可以打补丁并覆盖Yihui的knitr:::pandoc_one()以删除多余的'-t'和格式,但我想知道这可能会在其他地方产生什么副作用。这个解决方案不可持续,也不是"正确的方法(商标)"。
有没有解决这个问题的"正确方法(商标)"?我是否漏掉了一种简单/明显的解决方案?
顺便说一句:感谢knitr的作者Yihui Xie和pandoc的作者John MacFarlane。真棒!(也许我可以向其中一个或两个提交补丁建议来解决我的用例,尽管如果只是我一个人,那可能不值得)。
1个回答

8
我认为你所需的所有信息都在?pandoc中,其中包括运行system("pandoc -h")以查看可能的输出格式的示例。从中你可以了解到:
输出格式:asciidoc、beamer、context、docbook、docx、dzslides、epub、epub3、fb2、html、html5、json、latex、man、markdown、markdown_github、markdown_mmd、markdown_phpextra、markdown_strict、mediawiki、native、odt、opendocument、opml、org、pdf*、plain、revealjs、rst、rtf、s5、slideous、slidy、texinfo、textile [*对于pdf输出,请使用latex或beamer和-o FILENAME.pdf]
因此,基本上format = "pdf"是无效的,你应该使用pandoc("tmp.Rmd", format = "latex", ext = "pdf")(实际上根据?pandocext="pdf"部分是默认值,所以你只需要pandoc("tmp.Rmd", "latex"))。至于为什么pandoc('whitepaper.Rmd', 'pdf')导致调用-t pdf,那是因为你在pandoc()调用的第二个参数中告诉它这样做。

你知道吗,我一直在忙于研究其他帖子、问题等等,以至于我忽略了?pandoc中的ext选项和明显的文本示例。叹气。谢谢。 - r2evans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接