2 minute read

書籍のような長い文章をLaTeXで書く際に,参考文献をchapterごとに出力したい場合に使える方法について紹介する.overleafの記事がよくまとまっているのでまずはそちらを参照されたい.

Creating multiple bibliographies in the same document

選択肢

参考文献をchapterごとに出力する際,以下のような4つのパッケージが有名な選択肢となる.

エンジン ツール名
bibtex chapterbib
bibtex bibunits
bibtex multibib
biblatex デフォルト

まず,エンジンとしてbiblatexを使う場合は追加のパッケージを使うことなくオプションで指定できる.試してみた感じはこれが一番楽にできる.

\usepackage[natbib,style=authoryear,refsection=chapter]{biblatex}

ただし,例によって出版社によってbiblatexが使えないところもあるので,その場合はbibtexで使えるchapterbib, bibunits, multibibの3つから選択することになる.multibibはchapterごとに出すというより複数bibファイルを扱うことを目的としており,単一bibで普通にやりたいということであればchapterbibかbibunitsが良い.私の場合はchapterが違っても同一の文献を都度参照することが多かったので,尚更複数bibファイルに分けるメリットもなかった.

chapterbibとbibunitsの比較では,bibunitsの方がディレクトリ構造などに柔軟に対応できる感じで使いやすかったため,今回はbibunitsを採用した.

bibunits

基本的な使い方

主要なlatex環境ではプリインストールされているので,利用するにはプリアンブルでパッケージをロードするのみで良い.

\usepackage{bibunits}

そして,chapter自体をbibunits 環境で囲む.より正確には参考文献を出力したい範囲をbibunits環境でくくるイメージで,chapter以外にもsectionごとの文献出力などが可能である.そして参考文献を出したいところで\putbib[filename]コマンドを設定する.拡張子の.bibは省略しないといけない.例えば以下の例では,一つ目のセクションでrefs1.bibを,二つ目のセクションでrefs2.bibを参照して都度referencesを出力する.bibunits はオプションとして参考文献スタイルを指定できる.指定しなかった場合はデフォルト(\defaultbibliographystyleで設定可能)が利用される.

\documentclass{article}
\usepackage[utf8]{inputenc}
\title{Multiple bibliographies with bibunits}

\usepackage{bibunits}

\\usepackage{filecontents} % bibファイルをtexファイル内に書くため (実際の運用では別ファイルにする)

% bibファイルの内容をここに記述 (filecontents環境)
\\begin{filecontents}{refs1.bib}
@article{Einstein1905SR,
  author  = {Albert Einstein},
  title   = {Zur Elektrodynamik bewegter Körper},
  journal = {Annalen der Physik},
  volume  = {322},
  number  = {10},
  pages   = {891--921},
  year    = {1905},
  doi     = {10.1002/andp.19053221004}
}
@article{Einstein1905PE,
    author  = {Albert Einstein},
    title   = {Über einen die Erzeugung und Verwandlung des Lichtes betreffenden heuristischen Gesichtspunkt},
    journal = {Annalen der Physik},
    volume  = {322},
    number  = {6},
    pages   = {132--148},
    year    = {1905},
    doi     = {10.1002/andp.19053220607}
}
\end{filecontents}

% bibファイルの内容をここに記述 (filecontents環境)
\\begin{filecontents}{refs2.bib}
@book{Dirac1930,
  author    = {Paul Adrien Maurice Dirac},
  title     = {The Principles of Quantum Mechanics},
  publisher = {Clarendon Press},
  year      = {1930},
  address   = {Oxford}
}
\end{filecontents}

\begin{document}

\begin{bibunit}[plain]
\section{A section}
This is the first part with citations from \texttt{refs1.bib}, using the \texttt{plain} style. \cite{Einstein1905SR,Einstein1905PE}

\putbib[refs1]
\end{bibunit}

\begin{bibunit}[alpha]
\section{Another section}
This is the first part with citations from \texttt{refs2.bib}, using the \texttt{alpha} style. \cite{Dirac1930}

\putbib[refs2]
\end{bibunit}

\end{document}

全体で一つのbibファイルを利用する場合は都度putbibで指定するのは面倒なので,プリアンブルで以下の指定を入れる.

\defaultbibliographystyle{jplain} % デフォルトのスタイルを jplain に設定
\defaultbibliography{myrefs}     % デフォルトのbibファイルを myrefs.bib に設定

コード例

今回自身のプロジェクトで利用したディレクトリ構成を例に具体的なコード例を説明する.エントリーポイントとしてbook.texがあり,chapterごとにディレクトリが切られている以下のような構成を考える.gitにコードを配置した.

  • ディレクトリ構造

      .
      ├── appendixA
      │   ├── docs
      │   │   └── appendixA.tex
      │   ├── figures
      │   │   └── fig_A_1
      │   │       └── fig_A_1.pdf 
      │   └── include
      │       └── fig_A_1_include.tex
      ├── book.pdf
      ├── book.tex
      ├── bu1.bbl
      ├── bu2.bbl
      ├── bu3.bbl
      ├── bu4.bbl
      ├── chap1
      │   ├── docs
      │   │   ├── intro.tex
      │   ├── figures
      │   │   ├── fig_1_1
      │   │   │   └── fig_1_1.pdf
      │   │   ├── fig_1_2
      │   │   │   └── fig_1_2.pdf
      │   ├── include
      │   │   ├── fig_1_1_include.tex
      │   │   ├── fig_1_2_include.tex
      │   │   └── table_1_1_include.tex
      │   └── table
      │       └── table_1_1.tex
      ├── chap2
      │   ├── docs
      │   │   ├── 2_0_abst.tex
      │   │   ├── 2_1.tex
      │   │   ├── 2_2.tex
      │   │   └── chap2.tex
      │   ├── figures
      │   │   └── fig_2_1
      │   │       └── fig_2_1.pdf
      │   ├── include
      │   │   └── table_2_1_include.tex
      │   └── table
      │       └── table_2_1.tex
      ├── chap3
      │   └── docs
      │       └── conclusion.tex
      ├── frontmatter
      │   └── docs
      │       ├── acknowledgement.tex
      │       ├── acronym.tex
      │       ├── author.tex
      │       └── preface.tex
      ├── references
      │   └── ref.bib
      └── setting
          ├── path_setting.tex 
          └── preamble.tex
    

setting/には各種パッケージの読み込みとパスの設定ファイルを配置し,frontmatterにはacknowledgementや略語管理(acronym)を格納している.各チャプターのディレクトリでは,docs/figures/table/include/ の4つのディレクトリを切り,それぞれ文書,図,表,float環境を格納している.今回bibunitsを使うにあたっては図表は関係ないので一旦無視して,docs/ に注目しよう.

まず,chap1/ では単一のtexファイルで一つのチャプターを構成する例を示している.イントロや結論などあまり長くない章ではこのように単一ファイルで編集しても良い.


\begin{bibunit}
\setcounter{chapter}{0}
\chapter{Introduction}\label{chap:1}

% abstract
This is citation example~\cite{Einstein1905SR}.
\lipsum[60]
\putbib
\end{bibunit}

% if you submit, uncomment the following and comment bibunit
% \input{../../bu1.bbl}

次にchap2/ では,もっと長い章を編集する例を想定してchap2.tex で他の複数のファイルを読み込む.この場合にもchap1 の例と全く同様にbibunitを適用できる.

\begin{bibunit}
\setcounter{chapter}{1}
\chapter{Chapter 2 Theory and Method}\label{chap:2}
\acresetall
\input{docs/2_0_abst.tex}
\input{docs/2_1.tex}
\input{docs/2_2.tex}
\putbib
\end{bibunit}

今回はsvmonoクラスを利用しているが,他のクラスにも応用可能.

コンパイル

コンパイルすると,bibunitsはbibunit環境ごとに番号の振られた異なるaux,bblファイルを生成する.従って,通常コンパイル時はauxファイルの数だけbibtexを実行する必要があり少々面倒である.latexmkを利用すればコマンド一発でコンパイルできてこの問題は回避できる.用意する設定ファイル(.latexmkrc)はbibtex利用時のものと同一で良い.以下に例を示す.

#!/usr/bin/env perl

$latex            = 'platex -synctex=1 -halt-on-error';
$latex_silent     = 'platex -synctex=1 -halt-on-error -interaction=batchmode';
$bibtex           = 'bibtex';
$dvipdf           = 'dvipdfmx %O -o %D %S';
$makeindex        = 'mendex %O -o %D %S';
$max_repeat       = 100;
$pdf_mode         = 4; # 0: none, 1: pdflatex, 2: ps2pdf, 3: dvipdfmx, 4: lualatex

# tex options
$lualatex     = 'lualatex -shell-escape -synctex=1 -interaction=nonstopmode';
$pdflualatex  = $lualatex;
$pdflatex = 'lualatex %O -synctex=1 %S';

# preview
$pvc_view_file_via_temporary = 6;
## output directory
#$aux_dir          = "build/";
#$out_dir          = "build/";

# cleanup
# remove files except dvi, ps, pdf
$cleanup_mode = 2;

ただし,実行時に途中でreferenceが見つからないというエラーで止まってしまうことがあり,この場合は-f オプションで最後までコンパイルさせるとちゃんとしたファイルが生成できる.

$latexmk -f book.tex 

投稿時

投稿時にbblファイルを含める場合は,各chatpterのputbibコマンドを\input{filename.bbl} で置き換えるだけで良い.

まとめ

bibunitsパッケージは、LaTeX文書内で章やセクションごとに独立した参考文献リストを作成したい場合に有用なツールなので,長めの文書を作成する際はぜひ活用してほしい.