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

r2e*_*ans 3 pdf markdown r pandoc knitr

锋线:使用pandoc()在knitr,它试图编译.MD或.Rmd成PDF时抱怨.

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

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

使用whitepaper.Rmd作为输入文件,我pandoc('whitepaper.Rmd', 'pdf')在R中运行并立即获得:

> 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
Run Code Online (Sandbox Code Playgroud)

我明确地在我的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"')
Run Code Online (Sandbox Code Playgroud)

已经有关于该主题的许多其他对话:14586177,14508429,15258233,以及重讨论11025123.他们都解决了需要命令行工作,额外中间步骤,外部Makefile或knit2pdf()(使用texi2pdf,不需要)的解决方案.

我看到它们的约束:

  • 在R环境中轻松操作;
  • 利用Yihui的" <!--pandoc ... -->"文件内配置(允许我在我的模板之间继续任意切换,以获得其中一个示例);
  • 优选地,用单个"标准化"命令(即" pandoc('whitepaper.Rmd', 'pdf')")执行该操作.

...这样,一旦参数设置在文件中,编辑和重新渲染就相对来说已经死了.

我可以修补和覆盖Yihui's knitr:::pandoc_one()以消除'-t'和格式的冒犯性添加,但我想知道其他地方可能有什么副作用.这种解决方案不可持续,也不是"正确的方式(tm)".

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

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

Ist*_*sta 6

我认为你需要的所有信息都在?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 [*for pdf output,use latex or beamer and -o FILENAME.pdf]

所以基本上format = "pdf"是无效的,你应该使用pandoc("tmp.Rmd", format = "latex", ext = "pdf")(并且实际上该ext="pdf"部分是默认的,根据?pandoc,所以你真正需要的是pandoc("tmp.Rmd", "latex")).至于为什么pandoc('whitepaper.Rmd', 'pdf')导致打电话-t pdf,你告诉它在你的pandoc()电话的第二个参数中这样做.