我正在尝试用 bookdown 写我的博士论文,主要使用 pdf 输出。我很容易在文档的末尾添加了一个参考书目,但我宁愿在每章的末尾都有一个参考书目。我尝试使用允许这样做的 LaTeX 包调整 .tex 输出,但这与 bookdoown 的默认设置相冲突。有没有办法调整 .yaml 选项来启用它?
2 回答
对于 HTML 输出,默认是使用每章参考书目。对于 PDF 输出,我发现最好将 LaTeX 包biblatex
与biber
. 由于 RStudio 不了解 biber,因此最好安装类似的工具latexmk
并将 RStudio 配置为通过Sys.setenv(RSTUDIO_PDFLATEX = "latexmk")
. 这些程序可能必须单独安装,例如在 Debian/Ubuntu/...
sudo apt-get install texlive-bibtex-extra biber latexmk
对于配置https://tex.stackexchange.com/questions/199336/biblatex-reference-both-by-chapter-and-at-the-end-of-the-bookbiblatex
提供的解决方案是合适的。
最后,以下设置是必要的_output.yml
:
bookdown::pdf_book:
citation_package: biblatex
在Index.Rmd
:
biblio-style: authoryear
biblatexoptions: [refsegment=chapter]
在每章的最后:
\printbibliography[segment=\therefsegment,heading=subbibliography]
无需转义此原始 LaTeX 命令,因为pandoc
忽略其他输出格式的此类命令。
可以在以下位置查看整个解决方案
- https://github.com/rstub/bookdown-chapterbib
- https://rstub.github.io/bookdown-chapterbib/
- https://rstub.github.io/bookdown-chapterbib/bookdown-chapterbib.pdf
原始解决方案
我设法使用以下步骤获得带有 PDF 输出的章节书目:
- 从https://github.com/rstudio/bookdown-demo的副本开始
- 复制
<R-library-path>/rmarkdown/rmd/latex/default-1.17.0.2.tex
到book.tex
工作目录 - 更新
book.tex
以使用 LaTeX 包bibunits
(下面的差异) - 更新
_output.yml
以引用book.tex
为template
(下面的差异) index.Rmd
在(下面的差异)中设置 YAML 选项- 将代码添加到某些
Rmd
文件以编写\putbib
命令(下面的差异)
在这些更改之后,可以生成一个 PDF 文件,但缺少所有参考,因为bookdown
不知道生成的bu?.aux
文件。执行bibtex bu1
和后,通过生成带有章节书目bibtex bu2
的 PDF 文件来复制 PDF 文件。bookdown
最好使用 Makefile 自动执行此步骤。
这里是模板之间的差异:
$ diff -u /usr/local/lib/R/site-library/rmarkdown/rmd/latex/default-1.17.0.2.tex book.tex
--- /usr/local/lib/R/site-library/rmarkdown/rmd/latex/default-1.17.0.2.tex 2017-12-11 19:14:54.643867696 +0100
+++ book.tex 2018-01-16 11:43:46.182542634 +0100
@@ -93,8 +93,11 @@
\fi
$endif$
$if(natbib)$
-\usepackage{natbib}
+\usepackage[$natbiboptions$]{natbib}
\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$}
+\usepackage{bibunits}
+\defaultbibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$}
+\defaultbibliography{$for(bibliography)$$bibliography$$sep$,$endfor$}
$endif$
$if(biblatex)$
\usepackage$if(biblio-style)$[style=$biblio-style$]$endif${biblatex}
@@ -235,6 +238,7 @@
$endfor$
\begin{document}
+\bibliographyunit[\chapter]
$if(title)$
\maketitle
$endif$
以及来自以下文件的差异bookdown-sample
:
$ git diff
diff --git a/01-intro.Rmd b/01-intro.Rmd
index 6b16e73..1a5f9de 100644
--- a/01-intro.Rmd
+++ b/01-intro.Rmd
@@ -19,3 +19,5 @@ knitr::kable(
```
You can write citations, too. For example, we are using the **bookdown** package [@R-bookdown] in this sample book, which was built on top of R Markdown and **knitr** [@xie2015].
+
+`r if (knitr:::is_latex_output()) '\\putbib'`
diff --git a/02-literature.Rmd b/02-literature.Rmd
index 00745d0..983696e 100644
--- a/02-literature.Rmd
+++ b/02-literature.Rmd
@@ -1,3 +1,6 @@
# Literature
Here is a review of existing methods.
+[@R-knitr]
+
+`r if (knitr:::is_latex_output()) '\\putbib'`
diff --git a/_output.yml b/_output.yml
index 342a1d6..cc8afb1 100644
--- a/_output.yml
+++ b/_output.yml
@@ -14,4 +14,5 @@ bookdown::pdf_book:
latex_engine: xelatex
citation_package: natbib
keep_tex: yes
+ template: book.tex
bookdown::epub_book: default
diff --git a/index.Rmd b/index.Rmd
index 4e21b9d..2fdb813 100644
--- a/index.Rmd
+++ b/index.Rmd
@@ -7,6 +7,8 @@ output: bookdown::gitbook
documentclass: book
bibliography: [book.bib, packages.bib]
biblio-style: apalike
+natbiboptions: sectionbib
+graphics: yes
link-citations: yes
github-repo: rstudio/bookdown-demo
description: "This is a minimal example of using the bookdown package to write a book. The output format for this example is bookdown::gitbook."
对于特定于乳胶的解决方案,请参阅这篇文章,即使用sectionbib
选项natbib
并加载chapterbib
包。您将需要编辑 bookdown 模板以设置所需的选项natbib
并告诉 bookdown 在 yaml 中使用您的自定义模板。有关 bookdown 模板的更多信息,请参阅此帖子。
我发誓我在 bookdown 文档中看到了使用 gitbook 格式执行此操作的说明,但我似乎找不到它......
编辑我去看了我的一个旧的书本项目。对于gitbook
输出,您在 中指定以下内容_output.yml
:
bookdown::gitbook:
split_by: chapter
split_bib: yes
这将(你猜对了)按章节拆分参考书目。我实际上有点惊讶 bookdown 不支持 yaml 选项的等效选项,但通过在LaTeX preamble中设置/bookdown::pdf_book
应该很容易做到。sectionbib
chapterbib