前台 :使用 pandoc()
在 knitr 中,它在尝试将 .md 或 .Rmd 编译为 PDF 时会报错。
正如许多地方所记录的那样,我正在简化可重复研究的过程。我正在使用 pandoc
和 knitr
并制作出色的文件。我也在尝试为一些不擅长编程的同事进行简化,但我们正在尝试使用类似的文件。 “用户友好”以 Markdown 为中心的编辑器有多种选择,出于多种原因,我倾向于使用 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
我的 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,不需要)。我看到的约束:
<!--pandoc ... -->
”文件内配置(允许我继续在我的模板之间任意切换,例如几个示例之一);
pandoc('whitepaper.Rmd', 'pdf')
”)执行此操作。 ...这样,一旦在文件中设置了参数,编辑和重新渲染就相对脑死亡。
我可以修补和覆盖一辉的
knitr:::pandoc_one()
删除'-t'和格式的违规添加,但我想知道其他地方可能有什么副作用。这个解决方案是不可持续的,也不是“正确的方式(tm)”。对解决此问题的“正确方法(tm)”的建议?我错过了一个简单/明显的解决方案吗?
顺便说一句:谢谢 Yihui Xie 的 knitr 和 John MacFarlane 的 pandoc。太棒了!
(也许我可以向其中一个或两个提交补丁建议以解决我的用例,但如果只有我那么它可能不值得。)
最佳答案
我认为您需要的所有信息都在 ?pandoc
中,其中包括运行 system("pandoc -h")
的示例查看可能的输出格式。从中你了解到
Output formats: 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()
的第二个参数中告诉它这样做称呼。
关于r - knitr pandoc : "cannot produce pdf output with pdf writer",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22056671/