只改一个词。把 \usepackage 里的 style=numeric 换成 style=authoryear,正文中的每一处引用、参考文献列表中的每一条,都会以另一种体例排出来。这一个词几乎就是使用 biblatex 及其后端 biber 的全部理由。经典 BibTeX 把格式锁在用栈式语言写成的 .bst 程序里;biblatex 则把格式交还给 LaTeX 宏——看得懂,也改得动——而把数据这一侧,也就是读取、消歧和排序,交给 biber。本页讲清楚让它跑起来的导言区(\usepackage[backend=biber, style=…]{biblatex}、\addbibresource、\printbibliography)、latex → biber → latex → latex 的编译流程、引用命令 \autocite、\parencite、\textcite,以及最常见的那次事故:编辑器一直在调用 bibtex,而参考文献始终是空的。
biblatex 与 biber 的区别:哪个是宏包,哪个是程序
biblatex 是 LaTeX 宏包,biber 是外部程序。 biblatex 决定引用和参考文献列表长什么样;biber 读取 .bib,解析交叉引用,判断哪些作者名需要消歧,完成排序并写出 .bbl。在 BibTeX 里,这两件事挤在同一个 .bst 文件中——数据处理和排版格式都用一种连名字都没有的后缀栈式语言写成,正如 BibTeX 页面所述。biblatex 把这一层拆开了。用它自己手册里的话说,格式如今“完全由 TeX 宏控制”,设计一套新样式只需要会用 LaTeX。
- 把
.bib(或其他数据源)解析进内部数据模型 - 解析
crossref、条目集合与关联条目 - 生成用于区分同名作者和相同作者列表的数据
- 按数据模型对每条条目做结构校验
- 为参考文献列表排序,必要时可让多个列表各用不同顺序
- 写出
.bbl,再由 biblatex 读回
后端由 backend= 选项指定,可取 biber、bibtex、bibtex8,默认是 biber。三者的差别首先体现在字符编码上。biblatex 手册把 bibtex 描述为“仅支持 US-ASCII 编码,排序始终不区分大小写”,把 bibtex8 描述为支持 US-ASCII 和 Latin-1 之类的 8 位编码,把 biber 描述为支持 US-ASCII、8 位编码、UTF-8、即时重编码以及依赖区域设置的排序。也就是说,一旦选了 bibtex,非英文参考文献就已经走进死路——这正是实际工作中最要紧的差别。biber 用 Perl 写成,但 TeX Live 和 MacTeX 直接附带可执行文件,因此不必另外安装 Perl。
这些名字值得记住。biblatex 由 Philipp Lehman 编写,他从 2006 年到 2012 年独自维护。2012 年 Philip Kime 接手,2017 年起 Moritz Wemheuer 持续参与(交接那几年 Audrey Boruvka 和 Joseph Wright 提供了帮助)。手册至今仍把 Lehman 列为作者,并写明“他优秀的原始代码大部分仍留在核心之中”。biber 则出自 Philip Kime 与 François Charette 之手,由于是专为 biblatex 设计的,它不能单独使用——给它一个 .bst 也无济于事。bibtex 是通用工具,而 biber 是 biblatex 的一个部件。
能跑起来的最小配置:\usepackage{biblatex}、\addbibresource、\printbibliography
三条命令就够了。在导言区用 \usepackage[backend=biber, style=…]{biblatex} 载入宏包,同样在导言区用 \addbibresource{refs.bib} 注册文献数据库,再把 \printbibliography 放到列表该出现的位置。引用则通过 \autocite、\parencite 这一族命令完成。.bib 文件本身的写法——@article 之类的条目类型、引用键、字段——与 BibTeX 完全一致,见文献数据库页面。正因如此,迁移的代价比看上去小得多。
\documentclass{article}
\usepackage[backend=biber, style=authoryear]{biblatex}
\addbibresource{refs.bib} % preamble only, and the .bib extension IS required
\begin{document}
\textcite{shannon1948} introduced the measure.
Later work built on it \autocite[see][45]{knuth1984}.
\printbibliography
\end{document}从 BibTeX 过来的人最先绊倒的,就是这条注册命令的写法。\addbibresource 只能写在导言区,它取代了正文末尾的 \bibliography{refs}。而且必须写出 .bib 扩展名:\bibliography 不带扩展名,但 \addbibresource 要求完整文件名,所以写成 \addbibresource{refs} 会找不到文件。多写几次即可把数据库分成多个文件;以 biber 为后端时,它还接受 \addbibresource[glob]{bib/*.bib} 这样的通配模式,以及以 http:// 开头的远程资源。另外 \bibliographystyle 在这里没有位置——样式改由 \usepackage 的选项决定。
这个 style= 其实是一个主选项,会一次载入两个文件:style=authoryear 会同时取用参考文献列表用的 authoryear.bbx 和引用用的 authoryear.cbx。默认值是 numeric。只有当两者需要不一致时——比如列表用作者-年份、引用用编号——才分别指定 bibstyle= 和 citestyle=。日常使用一个 style= 就够了。
为什么编译流程是 latex → biber → latex → latex
因为在跑完一遍之前,LaTeX 并不知道自己引用了什么。 第一遍运行时,biblatex 会把引用键和整套配置写入一个名为 .bcf 的 XML 控制文件。biber 读取这个 .bcf,与 .bib 对照处理,写出 .bbl。第二遍把 .bbl 读进来,第三遍确定交叉引用和页码。次数的道理和 BibTeX 一样,但要调用的程序是 biber 而不是 bibtex,而且传给它的不是 .tex,而是不带扩展名的作业名。改用 pdflatex 或 lualatex 时,只是把 latex 那一步换个名字,结构不变。
$ pdflatex document.tex # 1st pass: writes document.bcf with the cited keys
$ biber document # NOT bibtex, and no .tex extension: reads .bcf, writes .bbl
$ pdflatex document.tex # 2nd pass: pulls the .bbl in
$ pdflatex document.tex # 3rd pass: settles cross-references and page numbers这里的故障几乎只有一种成因:编辑器或 latexmk 仍被配置为调用 bibtex。biblatex 根本不往 .aux 里写 \citation、\bibdata 和 \bibstyle,所以运行 bibtex document 会一次冒出三行:I found no \citation commands---while reading file document.aux、I found no \bibdata command---while reading file document.aux、I found no \bibstyle command---while reading file document.aux。.bbl 不会生成,LaTeX 那边则给出 LaTeX Warning: Empty bibliography 和 LaTeX Warning: Citation 'knuth1984' on page 1 undefined,随后是 Package biblatex Warning: Please (re)run Biber on the file:。最后这一行本身就是答案:把原来跑 bibtex 的地方换成 biber。
$ latexmk -pdf document.tex # detects biblatex in the .fls/.bcf and runs biber itself手敲四条命令算不上工作流,所以实际工作中交给 latexmk。较新的版本会检测到 biblatex 并自动调用 biber,按需要重复运行。若从编辑器使用,最稳妥的办法是选一个基于 latexmk 的引擎:TeXShop 里的 LaTeXmk 引擎,或 VS Code 的 LaTeX Workshop 中使用 latexmk 的 recipe。Overleaf 会自行检测 biblatex 并运行 biber。只有手写的构建脚本需要留意——把 bibtex 那一行改成 biber。
is wrong format version:biber 与 biblatex 的版本必须成对
biber 与 biblatex 只有版本对得上才能工作。 biber 手册里列有两者的对照表,自 biber 2.7/biblatex 3.7 起,次版本号完全同步推进——TeX Live 2024 附带的是 biber 2.19 和 biblatex 3.19。这一点会在两种场合咬人:包管理器只更新了 biblatex,或者另外装的 biber(比如来自 Homebrew)排在 PATH 更靠前的位置。症状是出现 Package biblatex Warning: File 'document.bbl' is wrong format version - expected … 警告,而参考文献怎么改都不变。解决办法很平淡:从同一发行版同时更新 biber 和 biblatex,删掉 document.bbl,再重新编译。把 biber --version 和日志开头打印的 biblatex 版本对照一下,立刻就能看出是否脱节。
style=numeric 与 style=authoryear:一个词切换引用体例
在 style= 里换一个名字,引用和参考文献列表就一起变了。biblatex 自带五个通用体系——numeric、alphabetic、authoryear、authortitle、verbose——各有变体。有意思的是,样式在载入时还会替 autocite= 定好默认值:numeric、alphabetic、authoryear 设为 autocite=inline,而 authortitle 和 verbose 设为 autocite=footnote。也就是说,把引用放在正文里还是把出处落到脚注里,这个学科预设本身就写进了样式。
| style= | 引用的样子 | 设计预设 |
|---|---|---|
numeric | [1] | 默认值。相当于 LaTeX 自带的编号体例,并设定 autocite=inline |
numeric-comp | [1--3, 7, 8] | 把连续编号压成区间:[8, 3, 1, 7, 2] 变为 [1--3, 7, 8] |
alphabetic | [Jon95] / [JW86] | 相当于 BibTeX 的 alpha.bst;由作者与年份生成短标签 |
authoryear | Doe 1995a | 同一作者同年多篇时追加 a、b… 以示区别 |
authoryear-comp | Doe 1992, 1995a,b | 同一条命令中的多个文献若作者相同,作者名只出现一次 |
authortitle | Doe, Short title | 不把年份放到前面,若有 shorttitle 则使用它;autocite=footnote |
verbose | 首次完整著录,其后用短形式 | 首次引用即给出全部信息,因此没有参考文献列表也能成立 |
当投稿方规定了体例时,最快的办法是找现成的样式宏包。TeX Live 里有工程领域的 biblatex-ieee,心理学及相邻学科的 biblatex-apa,人文学科的 biblatex-chicago 与 biblatex-mla,自然科学的 biblatex-nature 与 biblatex-science,英国法的 oscola,还有一批国家标准样式:对应 GB/T 7714—2015 的 biblatex-gb7714-2015、俄罗斯 GOST 的 biblatex-gost、巴西 ABNT 的 biblatex-abnt、德国人文学科的 biblatex-dw。中文期刊多按 GB/T 7714 著录,biblatex-gb7714-2015 正是为此而写;若刊物只发一个 .bst,那么留在 BibTeX 一侧才是诚实的答案,分界线见 BibTeX 页面。
\autocite、\parencite、\textcite 怎么选
若作者名要作为句子的一部分被读到,用 \textcite;若引用是置于句外的附注,用 \parencite;若想把选择权交给样式,用 \autocite。 这三者背后的语法理由——“Knuth (1986) 指出”与“……已有论证 (Knuth, 1986)”是两种不同的语法对象——在引用基础页面有详述,这里只看 biblatex 的构造。所有引用命令都取 \parencite[前注][后注]{键} 的形式,键可用逗号分隔传入多个。只写一个方括号是后注——\parencite[45]{knuth1984};写两个则前后注都有——\parencite[see][45]{knuth1984}。
| 命令 | 输出什么 | 什么时候用 |
|---|---|---|
\cite | 最朴素的标签,不加任何东西 | 既不要括号也不要脚注,直接融进正文时 |
\parencite | 整条引用置于圆括号内(编号式与字母数字式为方括号) | 最常见的形式:作为附注放在句末 |
\textcite | 作者名加括号内的年份或标签:Doe (1995) | 当作者名充当句子成分(如主语)时 |
\footcite | 把整条引用落入脚注,并以句号收尾 | 习惯把出处放在脚注的学科 |
\autocite | 按 autocite= 的设定变成上面某一种 | 希望整篇文档的引用形态可以一次性切换时 |
\citeauthor | 只有作者名 | 在正文中只提人名,不带年份或编号 |
\citeyear | 只有出版年份 | 正文中刚写完作者名之后补上年份 |
\autocite 比其他命令高一层:它究竟变成什么,由 \usepackage 上的 autocite= 选项决定。可取的值是 plain(等同 \cite)、inline(等同 \parencite)、footnote(等同 \footcite)和 superscript(上标)。而且 \autocite 不只是「看」后面的标点,它还会挪动标点:在 autocite=footnote 下,紧随其后的标点会被移到脚注标记之前,也就是脚注号出现在句号之后。正是这点小体贴,让你把全文从正文引用一次性切换到脚注引用时,不必回头重新标点。
若要一次引用多篇文献、且每篇各带后注,可以用末尾带 s 的 multicite 形式。\parencites[35]{key1}[88--120]{key2}{key3} 只用一对括号,却能给每篇文献配上各自的页码范围;\autocites、\footcites 同理。另外,若你的手指还记得 BibTeX 时代的 natbib,写上 \usepackage[natbib=true]{biblatex} 就能把 \citep、\citet 等当作别名使用。迁移期这是个方便的过桥办法,不过新写的文档若坚持用 biblatex 自己的命令,换样式时的行为会更好预测。
sorting= 与 sortlocale=:让非英文参考文献排出正确顺序
顺序由 sorting= 决定。默认是 nty——name、title、year 的首字母。此外还有 nyt(姓名、年份、标题)、ynt(年份、姓名、标题)、ydnt(年份降序)以及 none(不排序,保持引用顺序),全都不必改动 .bib 即可切换。在 BibTeX 里,这些选择埋在 .bst 内部,只能通过在 plain、unsrt、alpha 之间挑一个来间接触碰。
在此之上,同样一批字符串,「正确的顺序」因语言而异。biber 把这件事交给 Perl 的 Unicode::Collate 模块,它完整实现了 Unicode 排序算法(UCA),再叠加 CLDR 的区域调整。效果一试便知。德语里 sortlocale=de_DE 给出 Mohr → Möller → Muster;换成电话簿式的 sortlocale=de_DE_phonebook,ö 按 oe 处理,顺序变为 Möller → Mohr → Muster。西班牙语更戏剧化:传统正字法下 sortlocale=es_ES_trad 把 ch 当作独立的字母,于是 Chávez 排在 Cortázar 之后(现代的 es_ES 则是 Cela → Chávez → Cortázar)。biber 手册特意提醒:babel 的 spanish 对应现代的 es_ES,若需要传统顺序,必须自己写明 es_ES_trad。
\usepackage[
backend=biber,
style=authoryear,
sorting=nyt, % name, year, title
sortlocale=de_DE_phonebook, % locale tailoring: umlauts sort as oe/ue/ae
maxbibnames=99, % list every author in the bibliography
maxcitenames=2, % but shorten to "et al." inside citations
backref=true % back-links from each entry to its citations
]{biblatex}照合算法能处理的,终究只是交到它手上的那些字符,这一限制在中文、日文和韩文里格外明显。指定 sortlocale=zh_CN 或 ja_JP 确实会套用相应的区域调整,但汉字本身不带读音,因此指望拼音序或五十音序必然落空。若顺序必须依读音,就得把读音写进数据:姓名读音放进 sortname,任意排序键放进 sortkey。biblatex 手册把 sortkey 称作主排序键——一旦存在,除 presort 外的其他一切都会被忽略。碰上某一条怎么都不肯就位时,这就是永远管用的最后手段。
同一行 \usepackage 还决定作者名如何截断。maxnames 默认是 3,minnames 默认是 1;maxbibnames 和 maxcitenames 若不指定,就直接继承 maxnames 的值。也就是说 maxnames 是父项,另外两个是子项。实际最常用的搭配正是上面代码里的那种:参考文献列表中列出全部作者(maxbibnames=99),而正文引用只留两位再加 “et al.”(maxcitenames=2)——这是单靠 maxnames 表达不了的。再加上 backref=true,每条文献末尾会写明它在正文哪几页被引用过,校对长稿时格外好用。
拆分参考文献列表:\printbibliography[type=…] 与 keyword=
\printbibliography 想写几次就写几次,每次可用不同的筛选条件。可用的键有 type=(只取该条目类型)、nottype=(排除该类型)、keyword= 与 notkeyword=(按 .bib 的 keywords 字段筛选)、category= 与 notcategory=(用 \DeclareBibliographyCategory 声明的分类),以及决定标题的 heading= 和 title=。把一手资料与二手文献分开、把专著与论文分开,因此完全不必改动数据。若条件更复杂,可用 \defbibfilter 定义自己的筛选器;按语言拆分列表也靠这套工具——langid 字段只负责切换本地化字串与断词,本身并不会把列表分开。
\printbibliography[type=article, title={Journal articles}]
\printbibliography[type=book, title={Books}]
\printbibliography[keyword=primary, title={Primary sources}]
\printbibliography[nottype=misc, heading=bibintoc, title={Everything else}]归结起来,判断分两步。若投稿方发给你一个 .bst,就留在 BibTeX;若体例由你自己定,就转到 biblatex 和 biber。 转过去之后只需做三件事:在导言区写下 \usepackage[backend=biber, style=…]{biblatex} 和 \addbibresource{refs.bib},放好 \printbibliography,并在编译时用 biber 取代 bibtex——或者干脆交给 latexmk。.bib 文件两边通用,多年积累不会丢。四十年后真正变了的是:改动体例不再意味着重写一个 .bst,而只是改 \usepackage 里的一个词。