预先:在knitr中使用pandoc()
,在尝试将.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。迷死人! (也许我可以向其中一个或两个提交补丁建议来解决我的用例,但如果它只是我那么它可能不值得。)答案 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
来电的第二个参数中执行此操作。