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

时间:2014-02-27 00:36:27

标签: r pdf markdown knitr pandoc

预先:在knitr中使用pandoc(),在尝试将.md或.Rmd编译为PDF时会抱怨。

我正在简化可重复研究的过程,正如许多地方所记录的那样。我正在使用pandocknitr并制作出色的文档。我也试图精简一些不熟悉编程的同事,但我们正试图使用​​类似的文件。 “用户友好”以降价为中心的编辑器有几种选择,出于几个原因,我倾向于使用RStudio(对于他们来说,emacs / ess对我而言,但这有所不同)。

我的工作流程:给他们一个markdown(.md或.Rmd)文件,让他们能够进行更改,并可选择将其重新呈现为PDF。不幸的是,RStudio不允许(AFAICT)允许设置模板或其他任意pandoc配置参数(例如章节,数字部分),因此在R / knitr中使用pandoc()在这里很有意义。

使用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'和格式的冒犯性添加,但我想知道其他地方可能有哪些副作用。这种解决方案不可持续,也不是“正确的方式(tm)”。

建议“正确的方式(tm)”来解决这个问题?我错过了一个简单/明显的解决方案吗?

顺便说一句:谢谢,谢毅辉,针织者,约翰麦克法兰,pandoc。迷死人! (也许我可以向其中一个或两个提交补丁建议来解决我的用例,但如果它只是我那么它可能不值得。)

1 个答案:

答案 0 :(得分:5)

我认为您需要的所有信息都在?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输出,使用乳胶或投影仪和-o FILENAME.pdf]

基本上format = "pdf"无效,您应该使用pandoc("tmp.Rmd", format = "latex", ext = "pdf")(根据ext="pdf"?pandoc部分是默认的,所以您真正需要的是{ {1}})。至于pandoc("tmp.Rmd", "latex")导致与pandoc('whitepaper.Rmd', 'pdf')通话的原因,您告诉它在-t pdf来电的第二个参数中执行此操作。