ト部蛸焼のブログ

日頃知ったことをアウトプットするためのブログ

中断しても番号が途切れない参考文献の出力

LaTeXでレポートや何かの申請書を書く際に*1,「3ページ目と6ページ目の後ろ」といったように複数の箇所に参考文献を分けて出力したいことがあるかもしれません.
このような場合,デフォルトのままでは「\begin{thebibliography}」とやるたびに文献番号がリセットされてしまいます.そこで,本記事では文献番号が連続するように複数個の参考文献を出力する方法を考えていきます.

なお,コードとその出力例は下記のOverleafに掲載しています.

Overleaf, Online LaTeX Editor

前提

LaTeXで参考文献を出力する最も基本的な方法は以下のようにすることです.

\begin{thebibliography}{9}
  \bibitem{文献1} 本界 多蔵.『本を書いたぞ』.出版出版.2021.
  \bibitem{文献2} 本場刈野 伊江.『本ばかりの家』.書店書店.2020.
\end{thebibliography}

このようにすると,この順で参考文献のリストに出力され,また,本文中で例えば「\cite{文献1}」とすると『本を書いたぞ』の引用ができます.

本記事では複数箇所に参考文献を挿入することを想定しますので,以下のようにthebibliography環境を2つ使った例を取り上げ説明を行います.

\begin{thebibliography}{9}
  \bibitem{文献1} 本界 多蔵.『本を書いたぞ』.出版出版.2021.
\end{thebibliography}
\begin{thebibliography}
  \bibitem{文献2} 本場刈野 伊江.『本ばかりの家』.書店書店.2020.
\end{thebibliography}

この場合の出力は以下のようになります.冒頭に述べたように出力されるラベルは共に「1」となり,番号がリセットされていることが分かります

f:id:tobetakoyaki:20210504135004p:plain:w500
ただ単に複数個の参考文献を使用しただけのときの出力の様子

本記事では次のように2つ目以降の参考文献の番号が中断したところから再開してくれるように設定することを目標とします.

f:id:tobetakoyaki:20210606135040p:plain:w500
継続される参考文献の出力の様子(今回の目標)

愚直な方法

\bibitemはオプション引数で文献ラベルを指定することが可能です.これを利用すれば,簡単に目標を達成できます*2

\begin{thebibliography}{9}
  \bibitem[1]{文献1} 本界 多蔵.『本を書いたぞ』.出版出版.2021.
\end{thebibliography}
\begin{thebibliography}{9}
  \bibitem[2]{文献2} 本場刈野 伊江.『本ばかりの家』.書店書店.2020.
\end{thebibliography}

なお,この方法によれば,例えば数字だけのラベリングだけでなく「本界21」のような「著者名+年号」タイプのラベリングも出力できます*3

jsarticle.clsのデフォルトのthebibliography環境を使用している場合

カウンタを直接いじる場合

すべてを手動で設定するのが面倒であれば,次のようにカウンタを逐次変更してやる方法もあります.

\begin{thebibliography}{9}
  \bibitem{文献1} 本界 多蔵.『本を書いたぞ』.出版出版.2021.
\end{thebibliography}
\begin{thebibliography}{9}
  \setcounter{enumiv}{1} % カウンタの値を変更
  \bibitem{文献2} 本場刈野 伊江.『本ばかりの家』.書店書店.2020.
\end{thebibliography}

thebibliography環境を直接いじる場合

「いちいちカウンタの値を入力するのなんてしたくない!」という方.やや怖いですが,thebibliography環境の定義を直接いじることでも解決できます*4

注意.カウンタの定義部分と設定部分である3行だけが追加した部分で,残りはjsarticle.clsによるthebibliography環境の定義の内容です.

\newcounter{patch@enumiv@numcarry} % 追加部分①
\renewenvironment{thebibliography}[1]{%
  \global\let\presectionname\relax
  \global\let\postsectionname\relax
  \section*{\refname}\@mkboth{\refname}{\refname}%
  \list{\@biblabel{\@arabic\c@enumiv}}%
    {\settowidth\labelwidth{\@biblabel{#1}}%
    \leftmargin\labelwidth
    \advance\leftmargin\labelsep
    \@openbib@code
    \usecounter{enumiv}%
    \setcounter{enumiv}{\value{patch@enumiv@numcarry}} % 追加部分②
    \let\p@enumiv\@empty
    \renewcommand\theenumiv{\@arabic\c@enumiv}}%
  \sloppy
  \clubpenalty4000
  \@clubpenalty\clubpenalty
  \widowpenalty4000%
  \sfcode`\.\@m}
  {\def\@noitemerr
    {\@latex@warning{Empty `thebibliography' environment}}%
  \setcounter{patch@enumiv@numcarry}{\value{enumiv}} % 追加部分③
  \endlist}

natbibパッケージを使用している場合

参考文献を綺麗に出力してくれるパッケージにnatbibパッケージ*5があります.
natbibパッケージを利用している場合はthebibliography環境の定義がjsarticle.clsとは全く異なるため,再定義の仕方を変更する必要があります.

カウンタを直接いじる場合

カウンタを直接いじる場合は,natbibパッケージが文献のラベリングを「NAT@ctr」というカウンタを用いて行っているため,先ほどの「\setcounter{enumiv}{1}」とする代わりに「\setcounter{NAT@ctr}{1}」を使えばよくなります.

thebibliography環境を直接いじる場合

また,thebibliography環境を直接いじる場合は,以下のようにします*6

注意. カウンタの定義部分と設定部分である3行だけが追加された部分で,残りの大部分は元々あるnatbib.styによるthebibliography環境の再定義の内容です.

\newcounter{NAT@patch@numcarry} % 追加部分①
\renewenvironment{thebibliography}[1]{%
 \bibsection
 \parindent\z@
 \bibpreamble
 \bibfont
 \list{\@biblabel{\the\c@NAT@ctr}}{\@bibsetup{#1}\global\c@NAT@ctr\z@}%
 \setcounter{NAT@ctr}{\value{NAT@patch@numcarry}}  % 追加部分②
 \ifNAT@openbib
   \renewcommand\newblock{\par}%
 \else
   \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}%
 \fi
 \sloppy\clubpenalty4000\widowpenalty4000
 \sfcode`\.\@m
 \let\NAT@bibitem@first@sw\@firstoftwo
    \let\citeN\cite \let\shortcite\cite
    \let\citeasnoun\cite
}{%
 \bibitem@fin
 \bibpostamble
 \def\@noitemerr{%
  \PackageWarning{natbib}{Empty `thebibliography' environment}%
 }%
 \setcounter{NAT@patch@numcarry}{\value{NAT@ctr}} % 追加部分③
 \endlist
 \bibcleanup
}%

*1:私自身が何かの申請書を最近書いたのかと言われれば,答えはNoになりますが.

*2:文献数が1桁であればこれでも全く問題はありませんが,この方法では桁数の異なるラベルが設定されたときに数字が左揃えで出力されてしまいます.これだと通常の参考文献が右揃えで数字を出力することと反するため,完璧な再現とはいえません.

*3:\bibitem[本界21]{文献1}のように書けばよいわけです.

*4:thebibliography環境はlistという環境を利用して出力されています.以下のコードはlist環境に対して番号をうまくやる解決法を提示したHow to interrupt/resume a list in LaTeX? - Stack Overflowを参考にしました.なおlist環境については例えばにっき♪: クラスファイルを作ろう(7)をご覧ください.

*5:ソース: CTAN: Package natbib

*6:natbib.sty (ver. 8.31) では1063行目からthebibliography環境の再定義がなされており,1068行目から続くlist環境の中で文献一覧が出力される仕組みになっています.