r - knitr pandoc : "cannot produce pdf output with pdf writer"

标签 r pdf markdown knitr pandoc

前台 :使用 pandoc()在 knitr 中,它在尝试将 .md 或 .Rmd 编​​译为 PDF 时会报错。

正如许多地方所记录的那样,我正在简化可重复研究的过程。我正在使用 pandocknitr并制作出色的文件。我也在尝试为一些不擅长编程的同事进行简化,但我们正在尝试使用类似的文件。 “用户友好”以 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,不需要)。

我看到的约束:
  • 在 R 环境中轻松操作;
  • 利用 Yihui 的“<!--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/

    相关文章:

    r - 创建具有不同间隔宽度且图例级别之间没有间隔的离散颜色条

    file - Flutter - 保存用户可见的文件

    r - 如何在R中使用RSelenium库缩小页面?

    r - 将 'list' 类型的列转换为数据框中的多列

    regex - 用 R 中的正则表达式解析(可能)不存在的数字

    pdf - 获取 PDF 文件的正确字数

    java - pdfbox 标题版本信息错误

    markdown - 如何将 Liquid 标签突出显示在有序列表中?

    markdown - 有没有办法使用 HTML 溢出 Markdown 表?

    ios - 'textStorage' 是一个只读属性 - 为 UITextView 使用 MarkdownKit 框架时出错