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은 불투명한 번호밖에 찍을 수 없습니다. nat 계열 스타일은 \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년보다 훨씬 앞서 있었습니다(harvard, apalike, chicago, astron). 그러나 그것들은 하나같이 원고를 한 가지 인용 방식에 묶어 두어, 번호식 학술지로 투고처를 바꾸면 본문을 손봐야 했습니다. 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가 멀쩡해 보인다는 것입니다. 번호만 있으면 되기 때문이라, 긴 초고에서는 눈에 잘 띄지 않습니다. 해결책은 데이터를 실어 나르는 스타일을 지정하는 것입니다. plain 대신 plainnat, abbrv 대신 abbrvnat, unsrt 대신 unsrtnat를 쓰거나, natbib이 읽을 수 있는 저자-연도 스타일(chicago, apalike, named, agsm, dcu, kluwer)을 고릅니다. 스타일을 바꾸면 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괄호도 위 첨자도 없는 맨 번호

모든 \cite… 명령이 같은 대괄호 부기(note)를 받지만, 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}.

\Citet\Citep: 문장 첫머리의 “della”, “van der”를 대문자로

첫 글자를 대문자로 만든 \Citet\Citep\Citealt\Citealp\Citeauthor(별표 형태도 있습니다)를 씁니다. 필요한 경우는 성에 “von 부분”이 붙어 있을 때입니다. della Robbiadella, van 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

본문을 한 글자도 고치지 않고 번호식·위 첨자로 바꾸기: numbers, super, sort&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]으로 나오는 이유: round, square, \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소괄호 (…). natbib이 모르는 .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는 오래된 원고나 클래스 파일에서 마주쳤을 때 읽을 수 있으면 충분합니다. 알려진 .bst의 구두점만 빌려 오려면 \citestyle{chicago}처럼 쓰면 되고, 직접 만든 .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의 대체는 sort 또는 sort&compress, mcite의 대체는 merge 또는 elide 옵션입니다. 그리고 citeref는 natbib 뒤에 불러와야 하며, 그렇지 않으면 오류가 납니다.

지금 natbib을 골라야 할까, biblatex으로 옮겨야 할까

투고 규정이 특정 .bst를 지목한다면 natbib을, 새 문서를 자유롭게 시작할 수 있다면 biblatex을 고르는 편이 낫습니다. natbib의 강점은 기존 .bib 파일과 .bst 스타일, bibtex 프로그램을 그대로 계속 쓸 수 있다는 점, 그리고 방금 본 것처럼 매우 많은 학술지 클래스가 그것을 전제한다는 점입니다. biblatex은 정렬을 맡는 biber 백엔드와 짝을 이루어 정렬과 서식을 모두 LaTeX 쪽에서 제어하며, 처음부터 다국어와 지역화된 출력을 염두에 두고 설계되었습니다. natbib 자체는 2010년 8.31b에서 갱신이 멈췄고, mergeelide 코드는 미국물리학회의 의뢰로 Arthur Ogawa가 썼습니다. 버전 문자열의 (PWD, AO)가 두 저자의 머리글자입니다. 둘은 함께 쓸 수 없으므로 하나를 골라야 합니다. 명령의 대응 관계(\citet\textcite, \citep\parencite)는 인용의 기본 페이지에, biblatex 쪽 세부는 biber / biblatex 페이지에 있습니다.