natbib

natbib という名前を、作者自身が「醜い名前」と書き残しています。パッケージの原典 natbib.dtx で Patrick W. Daly は、名前は Stephen Gildea の natsci.bst(natsci = natural sciences、自然科学)に由来し、「醜い名前だと認めるが、もう定着してしまって簡単には変えられない」と括弧書きで添えました。醜かろうと、LaTeX で古典的な BibTeX から (Jones et al., 1990) のような 著者–年式の引用 を出す方法は、いまも \usepackage{natbib} です。このページは \citet\citep の文法——それは引用の基本ページの担当です——のさらに先、実際につまずく場所を扱います。どの .bst なら動いてどれなら動かないのか、(author?) は何を意味するのか、そして roundsquare\bibpunct\setcitestyle のうち本当に括弧を決めているのはどれなのか。

\usepackage{natbib} と付属の三スタイル — plainnat・abbrvnat・unsrtnat

プリアンブルの二行で済みます。\usepackage{natbib}\bibliographystyle{plainnat} です。ただし二行目は見た目より重要で、ここを間違えると引用が壊れます。natbib は plainnatabbrvnatunsrtnat という三つの .bst を同梱していて、文献リストの体裁は標準の plainabbrvunsrt とまったく同じまま、各 \bibitem に一つだけ余分な情報——著者と年を別々にラベル付けしたもの——を書き込みます。この余分なラベルこそが仕掛けのすべてです。標準の BibTeX スタイルは \bibitem{jon90} としか書かないので、LaTeX には不透明な番号しか出せません。natbib 用のスタイルは \bibitem[Jones et al.(1990)Jones, Baker, and Williams]{jon90} と書き、natbib はこの一行から、略記の著者名・完全な著者名・年・番号を必要に応じて組み立てます。

実行の順序は素の BibTeX と変わりません。latex(または pdflatex)→ bibtexlatexlatex。最初の回で引用キーを .aux に書き出し、bibtex.bbl を作り、最後の二回でラベルを読み戻すからです。日本語文献には bibtex の代わりに pbibtex / upbibtex を使います。natbib が加えるのは、同じ .bib・同じ plainnat のまま、番号式の引用も出せる という一点です。著者–年式のパッケージは natbib が公開された 1993 年より前から存在しました(harvardapalikechicagoastron)。ただしどれも原稿を一つの引用方式に縛りつけ、番号式の雑誌に投稿先を変えれば本文を書き換える羽目になりました。natbib はそれらすべての \bibitem ラベルを読めるようにして、引用方式をパッケージオプション一つの問題に変えたのです。

document.tex
\documentclass{article}
\usepackage{natbib}
\bibliographystyle{plainnat}   % not plain: only plainnat carries author and year
\begin{document}

The line-breaking algorithm is described by \citet{knuth1986}.
The same idea is used elsewhere \citep[chap.~2]{lamport1994}.

\bibliography{refs}
\end{document}

% pdflatex doc -> bibtex doc -> pdflatex doc -> pdflatex doc
% (pbibtex or upbibtex instead of bibtex for Japanese references)

引用が (author?) になる — Author undefined for citation の意味

この二つ——PDF に太字で出る (author?) と、ログの Package natbib Warning: Author undefined for citation 'knuth1986' on page 1——は、指定した .bst が著者–年式に対応していないという意味です。\bibliographystyle{plain}\citet を組み合わせれば毎回こうなります。plain.bst は裸の \bibitem{knuth1986} を書くので natbib が拾える著者名が存在せず、\citet{knuth1986}(author?) [1] に落ちます。厄介なのは、同じ文書の \citep はまったく正常に見えることです——番号しか要らないからで、長い草稿では見落とされます。直し方はデータを運ぶスタイルを指定すること。plainplainnat に、abbrvabbrvnat に、unsrtunsrtnat に置き換えるか、natbib が読める著者–年式スタイル(chicagoapalikenamedagsmdcukluwer など)を選びます。スタイルを変えたら bibtex を再実行してください。.tex を書き換えただけでは .bbl のラベルは更新されません。

thebibliography
% plain.bst writes this -- no author, no year, so \citet cannot work
\bibitem{jon90}

% plainnat.bst writes this -- short list, year, then the full list
\bibitem[Jones et al.(1990)Jones, Baker, and Williams]{jon90}

% apalike.bst and friends: the minimal form natbib still accepts
\bibitem[Jones et al., 1990]{jon90}

引用命令の全家系 — \citet \citep の星付き、\citealt \citealp \citeauthor \citeyear

\citet\citep から先の命令は、すべて 引用を部品に分解する ためにあります。星を付けると「et al.」で略さず著者名を全員並べ、\citealt\citealp はそれぞれ \citet\citep と同じ中身を 括弧なし で出します(alt は textual、alp は parenthetical の名残です)。\citeauthor は著者名だけ、\citeyear は年だけを返すので、「Jones らは 1990 年に…」のような文を自分で組み立てられます。下の出力は \usepackage[round]{natbib}plainnat を組み合わせたときのもので、キー jon90 は Jones, Baker, and Williams (1990) を指します。なお \citet が最初から居たわけではありません。natbib の公開は 1993 年ですが、\citet が追加されたのはバージョン 6.2、1996 年 1 月 11 日——いまや natbib の代名詞になった命令は、パッケージ本体より二年以上遅れて生まれました。

命令出力例用途
\citet{jon90}Jones et al. (1990)地の文の引用。著者が文の一部になる
\citep{jon90}(Jones et al., 1990)全体を括弧に入れる引用
\citet*{jon90}Jones, Baker, and Williams (1990)著者を省略せず全員並べる(地の文)
\citep*{jon90}(Jones, Baker, and Williams, 1990)同じく全著者名(括弧つき)
\citealt{jon90}Jones et al. 1990\citet から括弧を外したもの
\citealp{jon90}Jones et al., 1990\citep から括弧を外したもの。自作の括弧に入れたいとき
\citeauthor{jon90}Jones et al.著者名だけ
\citeauthor*{jon90}Jones, Baker, and Williams全著者名だけ
\citefullauthor{jon90}Jones, Baker, and Williams\citeauthor* と同じ。古い綴りの別名
\citeyear{jon90}1990年だけ
\citeyearpar{jon90}(1990)年を括弧に入れる。著者名を先に書いた文の直後に
\citetext{priv.\ comm.}(priv. comm.)括弧の中に自由な文言を置く
\citenum{jon90}21括弧も上付きも付けない裸の番号

角括弧の付記(note)はどの \cite… にも書けますが、Daly 自身のマニュアルは 付記は \citep のためのもの だと明言しています。\citeyear\citeauthor に付けてもエラーにはならず、番号式では黙って無視され、著者–年式では後置の付記しか受け付けません。\citet に複数のキーを渡すのも「推奨しない」と書かれています——付記を伴うと前置の付記が年ごとに繰り返され、後置は最後の一つにしか付かないためで、Daly はこれを「バグだと認めるが、この機能の有用性が疑わしいので直す労力に見合わない」と説明しています。実務では、複数文献をまとめるのは \citep に任せ、\citet は一件ずつ使うのが安全です。同じ著者・同じ年の複数文献は (Jones et al., 1990a,b) のように自動でまとめられます。

latex
The algorithm is due to \citet{knuth1986}.
It runs in linear time \citep[Theorem~3]{knuth1986}.
See the discussion of line breaking \citep[see][chap.~2]{knuth1986}.
Similar ideas appear elsewhere \citep{knuth1986,lamport1994}.
Both papers agree \citep{jon90a,jon90b}.   % -> (Jones et al., 1990a,b)

% author and year taken apart by hand
\citeauthor{jon90} first made the claim in \citeyear{jon90}.

文頭の「della」「van der」を大文字に — \Citet\Citep

頭文字を大文字にした \Citet\Citep\Citealt\Citealp\Citeauthor(星付きもあります)を使います。必要になるのは、姓に「von 部分」——della Robbiadellavan der Waalsvan der——が付いている場合です。文中では小文字が正しいので \citet{dRob98}della Robbia (1998) と組みますが、その名前で文を書き出すなら先頭は大文字でなければなりません。natbib は .bib の姓を書き換えるのではなく、出力の一文字目だけを大文字化します。だから同じ文献を文中と文頭の両方で引用しても、文献リストの綴りは一つのまま保たれます。

命令出力
\citet{dRob98}della Robbia (1998)
\Citet{dRob98}Della Robbia (1998)
\Citep{dRob98}(Della Robbia, 1998)
\Citealt{dRob98}Della Robbia 1998
\Citealp{dRob98}Della Robbia, 1998
\Citeauthor{dRob98}Della Robbia

本文を一字も直さず番号式・上付きに切り替える — numberssupersort&compress

オプションを一語書き換えるだけです。\usepackage[numbers]{natbib} にすると \citet{jon90}Jones et al. [21] に、\citep{jon90}[21] に、付記つきの \citep[chap.~2]{jon90}[21, chap. 2] になります。\usepackage[super]{natbib} なら Nature 系の上付き番号です。本文の \citet / \citep はそのままで構いません——これこそ Daly が natbib を書いた理由そのもので、投稿先が変わっても書き換えるのはプリアンブルの一行だけ、という状態を作るための設計です。文献リストの体裁は .bst が決めるので、plainnat のまま番号式に切り替えられます。

番号式にすると、順序と圧縮の三つのオプションが効いてきます。sort は複数引用を文献リストの並び順に整え、compress は連番を範囲にまとめ、sort&compress は両方を行います。\citep{a,b,c}[21, 19, 20] ではなく [19–21] になるのはこれです。番号式で気をつける点が二つ。\citet に複数キーを渡すのは著者–年式以上に意味を持ちません(番号の前に著者名が並ぶだけです)。そして super モードでは \citeyearpar\citeyear と同じ挙動になり、括弧が消えます。上付き番号に括弧を付けたい雑誌((Ref. 21) のような形)は、括弧そのものを \setcitestyle{open={(},close={)}} で与える必要があります。そしてもう一つ、この節の約束を静かに破る命令があります。素の \cite は、著者–年式では \citet と同じ、番号式・上付きでは \citep と同じ振る舞いをします。つまり \cite で組み立てた文は、モードを切り替えた瞬間に文法上の役割が変わってしまいます。natbib を使うなら \citet\citep を書き、\cite は書かないでください。

latex
% author-year, the mode the nat styles assume
\usepackage{natbib}

% numeric, sorted, consecutive runs folded into ranges: [19-21]
\usepackage[numbers,sort&compress]{natbib}

% superscript numbers, as used by Nature and its relatives
\usepackage[super,sort&compress]{natbib}

% the body text is identical in all three cases

plainnat が [Jones et al., 1990] になる理由 — roundsquare\bibpunct\setcitestyle

\bibliographystyle{plainnat} が natbib 内部の \bibstyle@plainnat を呼び、それが \bibpunct{[}{]}{,}{a}{,}{,} と定義されているからです。natbib は .bst の名前ごとに句読点の対応表を持っていて(chicago は丸括弧+セミコロン、agu は角括弧、nature は括弧なしの上付き……)、plainnatabbrvnatunsrtnat は角括弧+カンマ区切りに割り当てられています。「natbib の既定は丸括弧」という説明をよく見かけますが、それが目に見えるのは natbib の表に載っていない .bst を使ったときだけです。逆に、括弧・区切り・モードのオプションを一つでも明示すると、natbib は内部的に nobibstyle を実行して .bst 由来の設定を切ります。だから \usepackage[round]{natbib} と書けば plainnat のままでも丸括弧に戻り、\usepackage[authoryear]{natbib} はその機構をわざわざ復活させます。

オプション効果
round丸括弧 (…)。表に無い .bst を使ったときの既定
square角括弧 […]
curly波括弧 {…}
angle山括弧 <…>
semicolon複数引用をセミコロンで区切る
colonsemicolon と同一。名前を誤った古いオプションで、8.0 で正しい綴りが追加された
comma複数引用をカンマで区切る
authoryear著者–年式。あわせて .bst 由来の句読点設定を有効に戻す
numbers番号式。内部で squarecomma も同時に実行される
super上付き番号。括弧は空になる(Nature 系)
sort複数引用を文献リストの並び順にそろえる
compress並べ替えずに連番だけ範囲にまとめる
sort&compress並べ替えたうえで範囲にまとめる。[19–21] の形になる
longnamesfirst各文献の初出だけ全著者名、二度目以降は et al.
sectionbibchapterbib と併用し、文献リストを \section* として組む
merge* を付けたキーを一つの番号にまとめる。mcite 相当の機能

プリアンブルで読み込んだあとに体裁を変えたいときは \setcitestyle{…} を使います(natbib 8.0、2007 年に追加)。カンマ区切りのキーワードを渡すもので、モードは authoryear / numbers / super、括弧は round / square / curly / angle、区切りは semicolon / comma。さらに key={value} の形で細かく指定できます——open={(}close={)} で括弧そのもの、citesep={;} で複数引用の区切り、aysep={,} で著者と年のあいだ、yysep={,} で年と年のあいだ、notesep={, } で付記の直前。\setcitestyle{square,aysep={},yysep={;}} のように書けば、角括弧・著者と年のあいだのカンマなし・年どうしはセミコロン、という投稿規定にそのまま合わせられます。

preamble
\usepackage[round,semicolon]{natbib}   % (Jones et al., 1990; Smith, 1989)
\bibliographystyle{plainnat}

% change it again, later in the preamble (natbib 8.0 and later)
\setcitestyle{square,aysep={},yysep={;}}

% the older equivalent: [notesep]{open}{close}{citesep}{mode}{aysep}{yysep}
% mode: n = numeric, s = superscript, anything else = author-year
\bibpunct[, ]{(}{)}{;}{a}{,}{,}

\bibpunct は同じ仕事をする古い命令で、省略可能引数一つと必須引数六つをとります。順に、開き括弧・閉じ括弧・複数引用の区切り・モード(n は番号式、s は上付き、それ以外は著者–年式)・著者と年のあいだ・同じ著者の年どうしのあいだ。先頭の省略可能引数は付記の直前に入る文字列で、既定は , です。読みやすさでは \setcitestyle が勝るので新規の文書ではそちらを使い、\bibpunct は既存の原稿やクラスファイルの中で出会ったときに読めれば十分です。\citestyle{chicago} のように既知の .bst 名を渡して句読点だけ借りることもでき、自前の .bst に句読点を結び付けたい場合は natbib.cfg\newcommand{\bibstyle@mystyle}{\bibpunct…} を書いておけば \bibliographystyle{mystyle} で自動的に適用されます。

クラスが勝手に natbib を読み込むとき — elsarticle の nonatbib、そして cite パッケージとの衝突

\usepackage{natbib} を書いた覚えがないのに \citet が動くなら、クラスファイルが読み込んでいます。Elsevier の elsarticle\RequirePackage[\@biboptions]{natbib} を実行し、止めたい人のために \documentclass[nonatbib]{elsarticle} というオプションをわざわざ用意しています。米国物理学会の revtex4-2\RequirePackage[sort&compress]{natbib} と、最低バージョンまで指定して読み込みます。TeX Live 2024 に入っているクラスファイルのうち 92 個が natbib に言及していて、Daly 自身も natbib は「多くの雑誌に支持されている(要求されている)」と書きました。ここで一つ落とし穴があります。番号をそろえたくて \usepackage{cite} を足すと、Package natbib Warning: The 'cite' package should not be used with natbib. Use option 'sort' instead が出ます。cite の代わりは sortsort&compressmcite の代わりは mergeelide オプションです。また citeref は natbib より後に 読み込まないとエラーになります。

いま natbib を選ぶべきか、biblatex に移るべきか

投稿規定が .bst を名指ししているなら natbib、自由に選べる新規の文書なら biblatex です。natbib の強みは、既存の .bib.bstbibtex プログラムをそのまま使い続けられること、そして先ほど見たとおり多くの雑誌クラスが前提にしていることにあります。biblatex(整列を担う biber と組み合わせて使います)は、並べ替えも書式も LaTeX 側で制御し、多言語・地域化された出力を最初から想定しています。natbib 自体は 2010 年の 8.31b で更新が止まっており、merge / elide の実装は米国物理学会の依頼で Arthur Ogawa が書いたものです——バージョン文字列の (PWD, AO) はこの二人の頭文字です。両者は併用できません。どちらか一方を選んでください。命令の対応(\citet\textcite\citep\parencite)は引用の基本ページに、biblatex 側の詳細は biber / biblatex のページにあります。