Есть ли способ добавить библиографию главы с помощью bookdown?

Я пытаюсь написать диссертацию на PhD с книжным шкафом и в основном использую PDF-выход. Я легко добавил библиографию в конце документа, но предпочел бы иметь библиографию в конце каждой главы. Я попытался настроить выход .tex с пакетами LaTeX, которые позволяют это, но это борется с значениями по умолчанию для bookdoown. Есть ли способ адаптировать параметры .yaml, чтобы включить это?

Ответ 1

Для решения, специфичного для латекса, см. этот пост, т.е. используйте параметр sectionbib для natbib и загрузите пакет chapterbib. Вам нужно будет отредактировать шаблон bookdown, чтобы установить необходимые параметры для natbib и сообщить bookdown, чтобы использовать свой настраиваемый шаблон в yaml. См. этот пост для получения дополнительной информации о шаблоне bookdown.

Клянусь, я видел инструкции в документах bookdown для этого с gitbook-форматом, но я не могу найти его...

EDIT Я пошел и посмотрел на старый проект моей книги. Для вывода gitbook вы указываете следующее в _output.yml:

bookdown::gitbook:
  split_by: chapter
  split_bib: yes

Что (как вы догадались) разделили библиографию по главам. На самом деле я немного удивлен тем, что bookdown не поддерживает эквивалентные опции для параметров bookdown::pdf_book yaml, но их должно быть достаточно легко сделать, установив sectionbib/chapterbib в преамбула LaTeX.

Ответ 2

Для вывода HTML по умолчанию используется использование библиографий на каждую главу. Для вывода PDF я нашел, что лучше всего использовать пакет LaTeX biblatex вместе с biber. Поскольку RStudio не знает о бибре, лучше установить такой инструмент, как latexmk, и настроить RStudio для использования с помощью Sys.setenv(RSTUDIO_PDFLATEX = "latexmk"). Эти программы, возможно, придется устанавливать отдельно, например. на Debian/Ubuntu/...

sudo apt-get install texlive-bibtex-extra biber latexmk

Для настройки biblatex рекомендуется решение, предлагаемое в https://tex.stackexchange.com/info/199336/biblatex-reference-both-by-chapter-and-at-the-end-of-the-book.

В конце в _output.yml необходимы следующие настройки:

bookdown::pdf_book:
  citation_package: biblatex

В Index.Rmd:

biblio-style: authoryear
biblatexoptions: [refsegment=chapter]

В конце каждой главы:

\printbibliography[segment=\therefsegment,heading=subbibliography]

Не нужно избегать этой необработанной команды LaTeX, поскольку pandoc игнорирует такие команды для других форматов вывода.

Можно увидеть все решение в

Исходное решение

Мне удалось получить библиографию главы с выходом PDF с помощью следующих шагов:

  • Начните с копии https://github.com/rstudio/bookdown-demo
  • скопировать <R-library-path>/rmarkdown/rmd/latex/default-1.17.0.2.tex как book.tex в рабочий каталог
  • update book.tex для использования пакета LaTeX bibunits (ниже)
  • update _output.yml для ссылки на book.tex как template (ниже)
  • установите параметры YAML в Index.Rmd (ниже)
  • добавить код в некоторые Rmd файлы для записи команды \putbib (ниже)

После этих изменений можно создать файл PDF, но все ссылки там, где они отсутствуют, поскольку bookdown не знает о сгенерированных файлах bu?.aux. После выполнения bibtex bu1 и bibtex bu2 воспроизведение PDF файла с помощью bookdown создало PDF файл с библиографией главы. Вероятно, лучше всего автоматизировать этот шаг с помощью 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$

И diff файлов из 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."