[英]knitr pandoc: “cannot produce pdf output with pdf writer”
锋线 :使用pandoc()
在knitr,它抱怨试图编译.MD或.Rmd成PDF时。
正如许多地方所记录的那样,我正在简化可重复研究的过程。 我正在使用pandoc
和knitr
并生成出色的文档。 我也试图精简一些不熟悉编程的同事,但我们正试图使用类似的文件。 “用户友好”以降价为中心的编辑器有几种选择,出于几个原因,我倾向于使用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"')
已经有关于该主题的许多其他对话: 14586177 , 14508429 , 15258233 ,以及重讨论11025123 。 他们都解决了需要命令行工作,额外中间步骤,外部Makefile或knit2pdf()
(使用texi2pdf,不需要)的解决方案。
我看到它们的约束:
<!--pandoc ... -->
”文件内配置(允许我在我的模板之间继续任意切换,用于几个例子中的一个); pandoc('whitepaper.Rmd', 'pdf')
”)。 ...这样,一旦参数设置在文件中,编辑和重新渲染就相对来说已经死了。
我可以修补和覆盖Yihui的knitr:::pandoc_one()
来删除'-t'和格式的违规添加,但我想知道其他地方可能有什么副作用。 这种解决方案不可持续,也不是“正确的方式(tm)”。
建议“正确的方法(tm)”来解决这个问题? 我错过了一个简单/明显的解决方案吗?
顺便说一句:谢谢,谢毅辉,针织者和约翰麦克法兰的pandoc。 迷死人! (也许我可以向其中一个或两个提交补丁建议来解决我的用例,但如果它只是我那么它可能不值得。)
我认为你需要的所有信息都在?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()
调用的第二个参数中这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.