引用基础

“Knuth (1986) 详细描述了把段落切分成行的过程”与“把段落切分成行的过程已有详细描述 (Knuth, 1986)”指向同一本书,但这两处引用在语法上是完全不同的成分:前者是句子的主语,后者只是停在句子之外的一条附注。LaTeX 之所以不满足于一个 \cite——natbib 把 \citet\citep 配成一对,biblatex 把 \textcite\parencite 配成一对——正是因为输出端必须知道你要的是哪一种角色。本页从输出引用标记讲到附加页码、合并多篇文献,再讲到引用变成 [?] 时怎么修,贯穿始终的只有一个检验办法:把句子念出来,看它还是不是一个句子。

\cite{key} 怎么写:引用键、多篇文献、页码

\cite{knuth} 会在正文里输出 [1],同时把该文献登记进参考文献列表。knuth引用键,一个由你自己决定的短名称。引用键本身绝不会出现在输出中,出现的只是列表那一侧分配的编号或标签。多篇文献可以用逗号分隔一次传入:\cite{knuth,lamport} 得到 [1, 2]。想附加页码之类的注记,就用可选参数:\cite[p.~5]{knuth} 输出 [1, p. 5]~ 是不允许断行的空格,因此 p.5 不会被拆到两行。

原生 LaTeX 只接受 一条 这样的注记,位置也是固定的:始终排在文献编号之后。像“(see Knuth, 1986, p. 94)”这样在名字前面加一句引导语的要求,在这里无法表达。natbib 与 biblatex 用两个可选参数取代一个,正是为了解除这项限制——下文“附加页码与章节”一节会讲到。反过来说,先弄清这条界限是有好处的:原生 \cite 能表达的范围比想象中窄。

latex
% \cite prints the mark and registers the work
The algorithm is described in detail~\cite{knuth}.

% several keys in one command, comma separated
Both accounts agree on this point~\cite{knuth,lamport}.

% one optional argument = a note printed after the reference
The rule appears on page 5~\cite[p.~5]{knuth}.

% register a work in the list without printing a mark
\nocite{lamport}

如果某篇文献不在正文中引用,却仍想让它出现在列表里,就用 \nocite{key}。它不输出引用标记,只完成登记。特殊写法 \nocite{*} 会把 .bib 文件中的 所有条目 都纳入列表。不过它只在 BibTeX 或 biber 负责组装列表时才有意义:手写的 thebibliography 无论如何都会把你写下的每一条 \bibitem 全部印出来,加上 \nocite{*} 也不会有任何变化。把它记成“展示整个文献数据库”的专用工具就够了。

\citet\citep\textcite\parencite 的区别

判断标准只有一条:作者名是否在句子里承担语法成分。承担,就用 natbib 的 \citet{knuth}(→ Knuth (1986))或 biblatex 的 \textcite{knuth}(输出相同);不承担,就用 \citep{knuth}(→ (Knuth, 1986))或 \parencite{knuth}(→ (Knuth 1986))。biblatex 手册把这项区别说得很直白:\textcite 就是为了嵌入正文行文、占据主语位置而设的;而对 \autocite,手册特意提醒它只适用于引用在语法上属于句子成分的场合。可见这两个系列对应的是句子结构,而非视觉偏好。

latex
% natbib: \citet is textual, \citep is parenthetical
\citet{knuth} describes how a paragraph is broken into lines.
The procedure is described in detail~\citep{knuth}.

% biblatex: same split, different names
\textcite{knuth} describes how a paragraph is broken into lines.
The procedure is described in detail~\parencite{knuth}.

一旦弄反,输出就不再是通顺的句子。把 \citep 放在主语位置,得到的是“(Knuth, 1986) 详细描述了把段落切分成行的过程”——一个由括号充当主语的怪句。反过来在句末用 \citet,则会留下“……过程已有详细描述 Knuth (1986)”,一个无处安放的人名。这两种错误在校对时出人意料地难以察觉,而且任何投稿格式检查都不会报警,因为这是语法错误,不是排版错误

那不如干脆交给原生 \cite?问题在于 \cite 根本不看语法。在 natbib 里它只是 模式的别名:加 authoryear 选项时等同于 \citet,加 numbers 选项时等同于 \citep。决定它的是导言区里的一个词,而不是你这句话的结构。biblatex 的 \cite 更为素净——不添加任何括号的裸标签,style=authoryear 下只输出 Knuth 1986,既放不进正文行文,也放不进括号。命令看不到你句子的句法,只有你看得到,所以才另外准备了两个把角色写明白的命令。

人们容易把这件事归入“作者-年份制才有的问题”,但这项区分在数字制下依然存在。natbib 的数字模式中,\citet{knuth} 输出 Knuth [1]\citep{knuth} 输出 [1];biblatex 的 style=numeric\textcite 同样给出 Knuth [1]。所以“先一律用 \cite 写着,回头再切换样式”是个陷阱:一旦切换,所有本该充当句子成分的引用都会塌缩成方括号,只留下缺了主语的句子。角色要在书写时就定下并记录——这是唯一稳妥的顺序。

命令(natbib)输出示例(authoryear)角色
\citetKnuth (1986)文本式;作者名充当句子成分
\citep(Knuth, 1986)括号式;置于句子之外的附注
\citeKnuth (1986)别名;authoryear 下等同 \citetnumbers 下等同 \citep
\citealtKnuth 1986不带括号的文本式,便于自行组括号
\citealpKnuth, 1986去掉括号的括号式,只留逗号
\citeauthorKnuth仅作者名,用于第二次及以后的提及
\citeyear1986仅年份,接在你自己写出的作者名之后
\citeyearpar(1986)带括号的年份,与 \citeauthor 搭配
\citenum1仅编号;不会排成上标
\citetext(priv. comm.)把没有文献键的说明放进引用括号

\citet\citep 还有带星号的形式,会把样式本应缩写为 et al. 的作者名 全部展开。三人合著时,\citep{jbw} 给出 (Jones et al., 1990),而 \citep*{jbw} 输出 (Jones, Baker, and Williams, 1990)。要求首次提及列出全部作者的期刊,正是它的用武之地。能否展开取决于 .bst 样式是否保留了全部作者名;样式若不支持,加星也无济于事,仍是缩写形式。

biblatex 保留同样的两种角色,又为引用的落点专设了命令。\footcite 把整条引用送进脚注,\supercite 把编号排成上标。\autocite 更抽象一层:它会依据宏包选项 autocite 的取值(plaininlinefootnotesuperscript)变身为 \cite\parencite\footcite\supercite。正文全用 \autocite 写,就能靠导言区的一个词在括号内引用与脚注引用之间整体切换——但它替代不了 \textcite,因为已经成为句子成分的引用无法被机械地丢进脚注。这一组里最有意思的是 \smartcite:它在正文中像 \footcite,在脚注内部像 \parencite,会看自己落在哪里再决定形态。

命令(biblatex)输出示例(style=authoryear)角色
\textciteKnuth (1986)文本式;占据主语位置
\parencite(Knuth 1986)括号式;数字类样式改用方括号
\citeKnuth 1986裸标签;不添加任何括号
\autocite(Knuth 1986)autocite 宏包选项改变形态
\footcite脚注:Knuth 1986.整条引用进入脚注,末尾补上句点
\smartcite脚注:Knuth 1986.正文中像 \footcite,脚注内像 \parencite
\supercite上标编号(无括号)仅限数字类样式;前后注记会被丢弃
\cite*1986作者-年份类样式只出年份,作者-标题类样式只出标题

附加页码与章节:[p.~5] 与前置注记 [see][p.~94]

natbib 与 biblatex 都接受 两个 可选参数:前一个是前置注记,后一个是后置注记。\citep[see][p.~94]{knuth} 输出 (see Knuth, 1986, p. 94)\citet[chap.~2]{lamport} 输出 Lamport (1994, chap. 2)。页码以外的定位——章、节、图、行——同样写在后置注记里。原生 \cite 无法表达的“在前面加一句引导语”,到这里就能实现了。

这里有一个连熟手都会踩一次的坑:只给出一个可选参数时,它会被当作后置注记。所以本想加个引导语而写成 \citep[e.g.,]{knuth},输出会是 (Knuth, 1986, e.g.,),“例如”被甩到文献后面。biblatex 也一样:\parencite[see]{knuth} 得到 (Knuth 1986, see)。正确写法要保留空的第二个参数:\citep[e.g.,][]{knuth}。两个方括号连排看着像写错了,但这正是对的。

biblatex 在这里有一处贴心的设计:当后置注记 只是一个数字 时,它会把它当作页码,并自动补上 p.\parencite[25]{knuth} 得到 (Knuth 1986, p. 25)。而且这个前缀并非固定,只要在 .bib 条目里加上 pagination 字段就能改。pagination = {verse} 会让同样的 [17] 变成 v. 17section 则变成 § 17。处理不按页计数的古典作品或乐谱时,这一个字段就能让全篇引用的表记统一。

latex
% one optional argument is always the post-note
\citep[p.~94]{knuth}       % -> (Knuth, 1986, p. 94)

% two optional arguments are pre-note and post-note
\citep[see][p.~94]{knuth}  % -> (see Knuth, 1986, p. 94)

% a pre-note alone still needs the empty second bracket
\citep[e.g.,][]{knuth}     % -> (e.g., Knuth, 1986)
\citep[e.g.,]{knuth}       % -> (Knuth, 1986, e.g.,)  <- wrong

% biblatex reads a bare number as a page and adds "p."
\parencite[25]{knuth}      % -> (Knuth 1986, p. 25)

一次引用多篇文献:编号的排序与压缩

多篇文献一定要 合并进一个命令 传入。\citep{knuth,lamport} 得到 (Knuth, 1986; Lamport, 1994),数字制下则是 [1, 2]。若写成 \cite{knuth}\cite{lamport},它们会以 [1][2] 的形式各自排开,样式既无法排序也无法压缩成范围——没有一起看到的东西,自然无从整理。正文式的多篇引用同理:biblatex 的 \textcite{knuth,lamport} 输出 Knuth (1986) and Lamport (1994),连接词都替你补上,句子仍是完整的句子。

若想给每篇文献配上各自的页码,就用 biblatex 的复数形式(限定引用列表)。\textcites[59]{knuth}[12]{lamport} 输出 Knuth (1986, p. 59) and Lamport (1994, p. 12),每个键都可以带自己的前置与后置注记。\parencites\footcites 等对应的复数形式一应俱全。natbib 没有等价机制,所以注记因文献而异时,只能并排写 \citep[p.~59]{knuth}\citep[p.~12]{lamport},中间的连接词自己补。

若想保持数字制、只改善外观,Donald Arseneau 的 cite 宏包最为省事。仅 \usepackage{cite} 一行,标准 \cite 就变聪明了:它会把编号 按升序排序,并把连续编号 压缩成范围\cite{c,a,b,e} 若指向第 2、3、4、6 条,输出就是 [2–4, 6]。可用选项有:superscript(别名 super)排成上标、nosort 停止排序、nocompress 停止范围压缩、nospace 收紧编号间空白、nobreak 禁止断行。不过 natbib 与 biblatex 自带排序与压缩(natbib 有 sortsort&compress 选项),用了它们就不需要 cite 了。

\cite 的编号从哪里来:thebibliography\bibitem

\cite{key} 输出的编号,来自持有同一个 key\bibitem。就地写出参考文献列表最基本的办法是 thebibliography 环境,其中每个 \bibitem{key} ... 代表一条文献。它们按出现顺序被编为 1、2、3……,\cite 取回对应的编号。\begin{thebibliography}{99} 里的 {99} 是传入 最宽标签 的参数,标签栏宽度由此推出:条目 10 条以上传 {99},9 条以下传 {9}。设错的话编号就对不齐,缩进也会参差不齐。若想用自定义标签代替编号,写成 \bibitem[KL94]{lamport} 即可,[KL94] 成为标签,\cite{lamport} 也会输出它。

document.tex
\begin{thebibliography}{99}
\bibitem{knuth}
Donald E. Knuth, \emph{The \TeX book}, Addison-Wesley, 1986.

% an optional argument replaces the automatic number
\bibitem[KL94]{lamport}
Leslie Lamport, \emph{\LaTeX: A Document Preparation System},
2nd ed., Addison-Wesley, 1994.
\end{thebibliography}

手写 thebibliography 适合两种情形:文献只有寥寥几条,或者你想把版式控制到每一个逗号。超出这个范围,把文献信息作为 未格式化的数据记录 存进 .bib 文件,再让 BibTeX 或 biber 组装列表,会更快、更准确、也更便于复用。编号、排序与样式都能按投稿规范自动完成,同一个 .bib 还可以在多份稿件之间共享。要紧的是,书写这一侧什么都不用改\cite{knuth} 只是从寻找 \bibitem 改为寻找 .bib 条目,本页讲到的命令原样通用。

引用变成 [?]/出现 Citation ... undefined

[?] 的意思是:排这一页的时候,.aux 文件里还没有那个键的标签。日志会给出 LaTeX Warning: Citation 'nosuchkey' on page 1 undefined on input line 4.,运行结束时再汇总一句 LaTeX Warning: There were undefined references.。原因只有两个:运行次数不够,或者键写错了

运行次数这件事,机制与编号、交叉引用完全相同。第一次运行把各个 \bibitem 的编号写入 .aux 文件,第二次读回来填进各个 \cite 的位置。若中间要经过 BibTeX 或 biber,顺序就是 latex → bibtex(或 biber)→ latex → latex,跳过中间那一步就会一直是 [?]。键这一侧,除了单纯的拼写错误,改了 .bib 却没重跑 BibTeX 也会出现同样的症状。删掉 .aux 从头再来,最容易把两者区分开。

biblatex 不输出问号,而是直接印出 键本身\parencite{nosuchkey} 会排成 (nosuchkey),日志里则出现 Package biblatex Warning: The following entry could not be found ...。版面上看着有点吓人,但由于走丢的键就写在纸上,定位原因反而更快。

还有一种症状是 natbib 独有的:明明用了 \citet,输出却是 (author?) [1],日志里写着 Package natbib Warning: Author undefined for citation 'knuth'。问题不在引用命令,而在 .bst 样式。像 \bibliographystyle{plain} 选中的那类不认识 natbib 的样式,不会把含作者名与年份的标签写进 \bibitem。换成支持 natbib 的样式,例如 \bibliographystyle{plainnat},即可解决。觉得 \citet 不工作时,先怀疑 .bst 是最快的路。

natbib 还是 biblatex:该用哪一套引用命令

只加载其中一个,并且从头贯彻到底 ——这就是全部的实务答案。两者用不同的设计解决同一件事,同时加载会导致命令名冲突。如果投稿方提供了文档类或样式文件,先服从它的要求;相当多的学会文档类默认使用 natbib。若可以自行选择,biblatex 在 Unicode 处理、多语种文档、脚注引用以及各学科样式的丰富程度上更占优势。natbib 自 1993 年起投入使用,配套的 .bst 文件数量庞大,这也是老模板仍然选它的原因。

无论选哪一个,判断的顺序都一样。先确定 这处引用是不是句子成分,据此选 \citet\textcite 还是 \citep\parencite;接着,需要定位就用可选参数,要合并多篇就用逗号列表或限定引用列表。外观——括号形状、数字制还是作者-年份制、分隔符——放在最后,那一层属于宏包选项与 .bst/样式文件的职责。按这个顺序写,换了投稿去处也只需改动最后一层。