【问题标题】:Pandoc insert appendix after bibliographyPandoc 在参考书目后插入附录
【发布时间】:2025-12-22 14:40:14
【问题描述】:

我在 R 中使用 knitr 包和 pandoc 将 .Rmd 文件转换为 PDF。 Pandoc 链接到 .bib 文件并自动在 PDF 的末尾插入参考书目 我的 .bib 文件中的条目如下所示,取自 http://johnmacfarlane.net/pandoc/demo/biblio.bib

@Book{item1,
        author="John Doe",
        title="First Book",
        year="2005",
        address="Cambridge",
        publisher="Cambridge University Press"
  }

@Article{item2,
         author="John Doe",
         title="Article",
         year="2006",
         journal="Journal of Generic Studies",
         volume="6",
         pages="33-34"
}

为了构建我的参考书目,我使用了以下函数,取自:http://quantifyingmemory.blogspot.co.il/2013/02/reproducible-research-with-r-knitr.html

knitsPDF <- function(name) {
  library(knitr)
  knit(paste0(name, ".Rmd"), encoding = "utf-8")
  system(paste0("pandoc -o ", name, ".pdf ", name, ".md --bibliography /Users/.../Desktop/test.bib --csl /Users/.../Desktop/taylor-and-francis-harvard-x.csl"))
}

我的 .Rmd 文件的内容是:

This is some text [@item1]

This is more text [@item2]

# References

输出的 PDF 如下所示:

如果我尝试插入附录,参考文献仍会打印在文档末尾,如下所示:

如何在参考文献后插入附录?

【问题讨论】:

    标签: r markdown knitr pandoc


    【解决方案1】:

    对于较新的 pandoc 版本,您可以使用 &lt;div id="refs"&gt;&lt;/div&gt; source 指定参考书目的位置

    This is some text [@item1]
    
    This is more text [@item2]
    
    # References
    
    <div id="refs"></div>
    
    # appendix
    

    【讨论】:

    • 这似乎对我不起作用。我的 Rmarkdown 文档的输出格式是bookdown::pdf_document2.
    • 我认为这应该成为公认的答案,因为它非常直截了当。
    【解决方案2】:

    最终引用处理将发生变化,以便可以将引用放置在您喜欢的任何位置 (https://github.com/jgm/pandoc/issues/771),但现在没有简单的方法来做到这一点。

    按照here 的建议,您可以将附录放在单独的文件中,使用 pandoc 将其转换为 LaTeX 片段,然后使用 --include-after-body 标志包含该片段。然后它会出现在参考书目之后。

    【讨论】:

    【解决方案3】:

    在处理 Rmarkdown 文档时,请输入以下文本,其中引用的位置。它可以放在文档的任何部分,以便在必要时添加其他材料,如附录。该方法依赖于 pandoc 的 fenced divs,它将在 Rmarkdown 中工作。

    ::: {#refs}
    :::
    

    上述代码不应位于 R 代码块中,而应单独放置在空行中。一旦 pandoc 通过 knitter 处理,此代码将产生与 @soca 的答案中提到的 &lt;div id="refs"&gt;&lt;/div&gt; 相同的结果。这两行代码始终允许在文档的任何部分中准确放置引用。

    在下面的示例中,引用首先放在同名标题下,而文档中的所有代码块随后放在代码附录中。这是放置在 Rmarkdown 中的 pandoc 围栏 div,可用于生成后面的图像。

    # References
    ::: {#refs}
    :::
    
    # Appendix A: R Code
    ```{r ref.label=knitr::all_labels(), echo=TRUE, eval=FALSE}
    
    ```
    

    如果 yaml frontmatter 中标识了一个 .bib 文件,则前面的 Rmarkdown 会产生类似于以下内容的输出:

    有用的链接:

    【讨论】:

    • 这是一个很好的建议,只是一个挑剔:解决方案使用 pandoc 的fenced divs,它与 R Markdown 无关。
    • 我编辑了答案,目的是正确引用 pandoc 的围栏 div 的使用。希望我做对了。