.bib 文件根本不知道自己最终会被排成什么样子——而这种「不知道」正是它的设计要点。它是一个纯文本数据库,形如 @article{shannon1948, author = {Shannon, Claude E.}, …},只记录一篇文献 是什么,从不记录它该长什么样。正因如此,一个 .bib 文件能比你写的每一篇 LaTeX 论文、比你投稿的每一家期刊都活得更久。麻烦之处在于,数据库是有语法的,而这套语法藏着几个出人意料的规则:在 .bib 里 % 并不表示注释的开始,人名中的逗号有非常特定的含义,而当样式决定改写你的标题时,你唯一的护甲只是一对花括号。本页讲的就是文件本身:条目类型、字段、引用键怎么选、人名的语法、重音字符、@string 与 crossref。
这种分工本身就是 1980 年代中期的设计决定。把数据(.bib)与外观(.bst 样式)分开,换投稿目标时只需改一行样式,数据完全不必动。反过来说:一旦你想把版式信息写进 .bib,多半就已经走错了路。工具怎么跑——latex → bibtex → latex → latex 的顺序、.bst 怎么选——属于 BibTeX 页面;正文里 \cite 怎么写属于引用页面。这里只看文件内部。
一个条目的内部:@类型{键, 字段 = {值}}
一个条目由三个部件构成:@ 之后的 类型、刚进入花括号的 引用键,以及用逗号分隔排列的 字段。除此之外没有第四样东西要学。下面是一条条目——香农 1948 年那篇奠定信息论的论文。
@article{shannon1948,
author = {Shannon, Claude E.},
title = {A Mathematical Theory of Communication},
journal = {Bell System Technical Journal},
volume = {27},
number = {3},
pages = {379--423},
year = {1948}
}细节相当宽容。值可以用花括号 { } 或双引号 " " 包起来,而像 year = 1948 这样的纯数字则可以什么都不加。最后一个字段后面的逗号可写可不写。类型名和字段名 不区分大小写,所以 @Article 与 @article、Title 与 title 是同一回事。实践中请统一用花括号:引号在值本身含有 " 时会崩,而花括号与 @string 宏配合起来也更自然。注意 pages = {379--423} 中的 双连字符,排版后会变成 en dash「–」。只写一个连字符,输出就是一个短横,用作范围是错的。
引用键怎么选(以及哪些字符不能用)
引用键完全属于你,只要在 .bib 内唯一,取什么都行。但它必须与正文中的 \cite{shannon1948} 逐字一致,包括大小写。常见约定是 姓 + 年(shannon1948),撞车时追加字母——shannon1948a、shannon1948b——而一个你记得住的键,长期看总胜过机器生成的键。禁用字符是固定的:花括号、逗号、空格、反斜杠、#、% 和 ~ 处处不允许,biber 还额外拒绝圆括号、引号和 =。同一个键定义两次,BibTeX 会报 Repeated entry---line 15 of file refs.bib,并且 把后一条整个丢掉。这是从文献管理软件重复导入同一条记录后的经典事故,因此这条消息值得记住。
该用哪种条目类型:@article、@book、@inproceedings 还是 @misc
类型声明的是「这篇文献 是什么」,而一旦选定,哪些字段出现、按什么顺序出现,也就由样式定下了。经典 BibTeX 有下列 14 种标准类型。每种类型都配有 必填字段(缺失即警告)和 可选字段,而保存这份对应关系的文件不属于你,属于样式(.bst)。
| 类型 | 用途 | 主要必填字段 |
|---|---|---|
@article | 期刊或连续出版物中的论文 | author, title, journal, year |
@book | 有明确出版社的书籍 | author 或 editor, title, publisher, year |
@booklet | 没有出版社的小册子、自印本 | title(至少) |
@inproceedings | 会议论文集中的论文 | author, title, booktitle, year |
@conference | @inproceedings 的别名(兼容 Scribe) | (同 @inproceedings) |
@proceedings | 会议论文集本身;crossref 的父条目 | title, year |
@incollection | 论文集或编著中的有标题章节 | author, title, booktitle, publisher, year |
@inbook | 书籍的一部分(章节或页码范围) | author/editor, title, chapter 或 pages, publisher, year |
@phdthesis | 博士论文 | author, title, school, year |
@mastersthesis | 硕士论文 | author, title, school, year |
@techreport | 研究机构等发布的技术报告 | author, title, institution, year |
@manual | 技术或软件手册 | title(至少) |
@unpublished | 未发表的稿件或草稿 | author, title, note |
@misc | 不属于以上类型的其他资料 | 无必填项(用 howpublished、note 补充) |
最容易犹豫的是两组。@inbook 与 @incollection:前者是一本书的一部分(比如你自己书的第 3 章),后者是编者所编文集中由另一位作者写成的独立篇章。@inproceedings 与 @conference 在功能上完全相同——@conference 只是为兼容 Scribe(BibTeX 所承袭的那套排版系统)而保留的别名,新写的条目请用 @inproceedings。学位论文按学位在 @phdthesis 与 @mastersthesis 之间选择;哪里都放不下的,就落到 @misc,再用 howpublished 或 note 撑起来。
现代的 biblatex 几乎涵盖了上述全部,并再加上几种:用于网络资源的 @online(别名 @electronic)、由 type 字段说明具体种类的通用 @report、不分学位层级的 @thesis,以及 @xdata——一种既不能被引用也不会出现在文献表里的纯数据容器,存在的意义只是被别的条目继承。@online 适合 arXiv 与预印本记录,与下文的 eprint 系字段配合使用。这些较新的类型以 biber/biblatex 为前提;经典的 bibtex 加 .bst 可能读不懂它们。
必填字段与可选字段——以及 DOI 和 URL 该写在哪里
字段就是 name = {value} 对。哪些必填、哪些可选因类型而异,而划这条线的是样式。缺少必填字段时 BibTeX 会警告;不认识的字段则(在多数样式中)被静默忽略——所以从外部导入元数据时随之而来的多余字段并不会造成伤害。以下是各种类型中都常见的字段。
author/editor— 作者或编者;多作者的写法见下一节。title— 标题:论文名、书名、章节标题。journal/booktitle— 期刊名(@article),或所在书籍、会议论文集的名称(@inproceedings、@incollection)。year/month/date— 经典 BibTeX 用year和month;biblatex 推荐 ISO 形式,如date = {2026-05-01}(只写date = {2026}也可以)。volume/number/pages— 卷、期与页码;范围用双连字符,pages = {379--423}。publisher/institution/school— 出版社/(报告的)发布机构/(学位论文的)授予学位大学。doi/url/urldate— DOI(只写10.…主体,不加https://doi.org/前缀)、URL,以及 biblatex 的访问日期。eprint/eprinttype/eprintclass— biblatex 的预印本字段。以 arXiv 为例:eprint = {2405.00001}、eprinttype = {arxiv}(旧称archivePrefix),学科写在eprintclass(旧称primaryClass)。note/howpublished— 自由补充说明/「如何发布」,@misc条目的 URL 通常放在这里。
这里有一个几乎人人都会踩一次的坑。经典标准样式根本不认识 doi 和 url。 plain.bst 里连一次 url 字符串都没有出现,你认真填好的字段就这样消失了——连一句警告都没有。出路有三条:加载 \usepackage{url},把地址塞进 howpublished = {\url{https://…}};换用确实认识它们的样式,比如 plainnat(natbib)或 IEEEtran;或者转向 biblatex——在那里 doi、url、urldate 都是一等字段,还能用 \usepackage[doi=false]{biblatex} 这样的选项关掉输出。正确的习惯是:数据里始终两样都写上,印不印交给样式决定。
% classic BibTeX: standard .bst styles drop doi/url, so use howpublished
@misc{tug2024,
author = {{TeX Users Group}},
title = {TeX Live 2024},
howpublished = {\url{https://tug.org/texlive/}},
note = {Accessed 7 August 2026},
year = {2024}
}
% biblatex: doi, url and urldate are proper fields
@online{arxiv2405,
author = {Doe, Jane},
title = {A Preprint with a {DOI}},
date = {2024-05-01},
eprint = {2405.00001},
eprinttype = {arxiv},
doi = {10.1000/example},
url = {https://arxiv.org/abs/2405.00001},
urldate = {2026-08-07}
}作者名怎么写:and、von、Jr 与四段式语法
多位作者用 and 分隔——绝不能用逗号,因为逗号另有职责。BibTeX 把一个人名读作 First、von、Last、Jr 四个部分,并且只接受三种写法:First von Last、von Last, First、von Last, Jr, First。逗号正是标示部分边界的记号。因此 author = {Shannon, Claude E.} 表示姓 Shannon、名 Claude E.。第一种自然语序通常够用,但有两种情况会失效:存在 Jr 时,以及姓由多词组成却没有 von 时。写成 Per Brinch Hansen,BibTeX 会把「Brinch」误读成名的一部分;写成 Brinch Hansen, Per,就不存在误读的余地。
@book{names2026,
author = {de la Vall{\'e}e Poussin, Charles Louis Xavier Joseph
and Brinch Hansen, Per
and Ford, Jr., Henry
and {The TeX Users Group}
and others},
title = {Four Ways to Write One Name},
publisher = {William Reid {and} Company},
year = {2026}
}那么 BibTeX 怎么知道 de la 属于 von 部?规则朴素得出人意料:如果一个词块在花括号之外的首字母是小写,它就算作 von。在 de la Vall{\'e}e Poussin 中,de 与 la 以小写开头,构成 von 部,随后的两个词是 Last 部。这条规则也可以反过来利用——在前面加一个以大写字母开头的哑控制序列,就能把小写开头的姓推进 Last 部。由此得出三条实用结论。作者太多时,把列表末尾写成 and others,样式会替换成「et al.」。团体名必须 整体用花括号包住,写作 {The TeX Users Group},以免其中的 and 被读成分隔符。在 biblatex 中,这条规则还延伸到 publisher、institution、organization、location 这类「字面列表」:属于公司名一部分的 and 必须加括号保护,写作 publisher = {William Reid {and} Company}。
重音字符与非 ASCII 人名:G{\"o}del 与 Gödel 并不相同
在经典 bibtex 眼中,带重音的字符是一个 「特殊字符」——从最外层的左花括号、其后紧跟一个反斜杠开始,直到与之匹配的右花括号为止的整块内容。{\"o} 和 {\'e} 就是这样的东西,而 BibTeX 把整块只算作一个字母。这一点在标签上显露无遗。用 alpha 样式,G{\"o}del 生成的标签是 G{\"o}d31;而同一个名字若写成原始 UTF-8 的 Gödel,得到的却是 Gö31——因为 ö 占两个字节,而按字节计数的 bibtex 0.99d 到此已经用完了三个「字符」。排序也会以同样的方式出问题,日文、中文、韩文的人名更是如此。实用结论只有一条:只要涉及非 ASCII 人名,就用 biber。biber 以 UTF-8 为前提设计,并按区域设置的排序规则来排列。若非留在经典 BibTeX 不可,就把名字写成 {\"o} 形式,或改用支持 8 位的 bibtex8 / bibtexu。
% classic bibtex + alpha.bst -> label [G{\"o}d31]
@article{godel1931a,
author = {G{\"o}del, Kurt},
title = {On Formally Undecidable Propositions},
journal = {Monatshefte},
year = {1931}
}
% same name in raw UTF-8 -> label [Gö31] under bibtex 0.99d; fine under biber
@article{godel1931b,
author = {Gödel, Kurt},
title = {Same Name, Raw UTF-8},
journal = {Monatshefte},
year = {1931}
}{DNA} 为什么需要花括号——以及什么时候不需要
plain、abbrv、unsrt、alpha 这些经典样式会把论文标题 除首字母外全部转为小写。于是 title = {A Theory of DNA and Galois Theory} 会印成「A theory of dna and galois theory」。专有名词和缩略语都不留情面。对付它的工具只有一个:给要保留的片段再套一层花括号。写作 {DNA},这段就被置于转换之外。不知道这一招,正是文献表被弄坏的头号原因。至于处理程序为何如此行事,属于 BibTeX 页面的话题。
但在 biblatex + biber 下情况就不同了。 numeric、authoryear 等标准样式根本不碰标题的大小写——你怎么写就怎么印。只有当你用 \DeclareFieldFormat{titlecase}{\MakeSentenceCase*{#1}} 之类的写法明确提出要求时,才会发生首字母大写化;即便如此,默认选项 bibtexcaseprotection=true 也会复现 BibTeX 那套花括号规则,{DNA} 依旧受保护。反之,若设定 bibtexcaseprotection=false,花括号便不再保护,改为用 \NoCaseChange{DNA} 明示。也就是说,「用花括号保护」这套做法在 biblatex 里仍然管用,只是 需要用到的场合比从前少得多。
这里有个值得一提的细节。旧的 .bib 文件常常只给单个大写字母加括号——title = {An Introduction to {L}a{T}e{X}}——但 biblatex 手册并不建议这样做,因为 花括号会杀掉所括字母两侧的字距调整(kerning),让单词的间距变得微微松散。整词加括号写成 {LaTeX},保护效果相同,却不会破坏字距。第二个细节:受保护的是花括号之内的内容,而不是控制序列之内的内容。宏必须连同其文字一起包住,如 {\TeX book};裸写的 \TeX 得不到保护。
% unprotected: plain.bst prints "A theory of dna and galois theory"
% protected: prints "A theory of DNA and Galois theory"
@article{protect2026,
author = {Doe, Jane},
title = {A Theory of {DNA} and {Galois} Theory},
journal = {J. Test},
year = {2026}
}
% brace the whole word, not single letters: {LaTeX}, not {L}a{T}e{X}
% wrap a macro together with its text: {\TeX book}@string 缩写、@preamble,以及 .bib 里的注释
同一个值反复出现时,@string 允许你定义一个 宏。把定义好的名字放在值的位置上、不加花括号,并用 # 与其他字符串连接。这是在期刊缩写名与全名之间切换的标准做法;常见的安排是把 @string 定义单独放进一个 .bib,并让它先被读取,如 \bibliography{strings,refs}。其实你早就在用这套机制了:标准样式预先把 jan 到 dec 这些月份定义成了 @string 宏,所以 month = jan 才要不加花括号地写——写成 month = {jan} 得到的不是宏,而是字面字符串「jan」。
@string{bstj = {Bell System Technical Journal}}
@preamble{ "\newcommand{\noopsort}[1]{} " }
@article{shannon1948,
author = {Shannon, Claude E.},
title = {A Mathematical Theory of Communication},
journal = bstj # { (Supplement)},
month = jan,
year = {1948}
}
@comment{ everything in here is skipped, portably }@preamble 则是另一路货色:它把自己的内容——通常是 LaTeX 宏定义——原样送到 .bbl 的开头。当某个小工具(例如用于排序的 \noopsort)应当随数据一起走时,就用它。至于注释,有一个著名的误解需要澄清:在 .bib 文件里,% 并不是注释符号。经典 bibtex 会忽略条目(@…{})之外的一切,所以以 % 开头的一行只是作为被忽略的文本通过,看起来「像」注释而已。真正的危险在里面:在字段值中写一个裸的 %,它会流进 .bbl,在那里变成 真正的 LaTeX 注释符号,把该行剩下的内容吃掉。在值里请始终写 \%。
可移植的写法是 @comment{ … },其内容会被完全跳过,在 biber 下也安全。这一点很重要,因为 biber 比经典 bibtex 严格:条目之外的散落文本会换来一句警告 warning: 30 characters of junk seen at toplevel。而如果你只是想暂时停用某个条目,最短的路径是删掉一个字符——把 @article{…} 改成 article{…},它就不再是条目,只是一段被忽略的文字。
会议信息只写一次:crossref 字段
crossref 字段让一个条目 从另一个条目继承它所缺的字段。当你要引用同一本论文集里的五篇文章时,没必要把会议名、编者和年份写五遍。放入一条 @proceedings 作为父条目,在每个子 @inproceedings 里写上 crossref = {gg1988},booktitle、editor、year 就都从上面降下来了。重复的数据消失了——同一个会议名出现五种细微不同写法这种麻烦,也随之一起消失。
@inproceedings{gneisser1988,
crossref = {gg1988},
author = {Gneisser, Rocky},
title = {No Gnats Are Taken for Granite},
pages = {133--139}
}
% the parent must appear LATER in the file than every entry citing it
@proceedings{gg1988,
editor = {Ford, Gerald and Carter, Jimmy},
title = {The Gnats and Gnus 1988 Proceedings},
booktitle = {The Gnats and Gnus 1988 Proceedings},
year = {1988}
}随之而来有三条规则。第一,父条目必须排在所有引用它的条目之后——正因如此,把 crossref 的父条目集中放在文件末尾成了惯例。第二,即使你从未 \cite 过父条目,只要 有两个或更多子条目指向它,它就会自行出现在文献表中;只有一个子条目时它不出现,其字段改为内嵌在那个子条目里印出。这个阈值可用 bibtex --min-crossrefs=N 调整。第三,嵌套的 crossref 并不可靠,所以别给父条目再安一个父条目。biblatex 另有一套机制 xdata,它只继承数据而不建立父子关系——像「出版社加地点」这种本身并非文献的组合,用它最为自然。
文献表的顺序由谁决定
不是你——而这是好消息。条目在列表中出现的顺序与你输入它们的顺序毫无关系;决定权在工具手上。在经典 BibTeX 中,顺序由样式(.bst)固定。 用户几乎没有发言权,所以选样式就等于选顺序。plain 与 alpha 按 作者名的字母顺序 排列,unsrt 按 正文中首次引用的顺序 排列,ieeetr 之类的工程样式同样如此。数据一字不动,只把 \bibliographystyle{plain} 改成 \bibliographystyle{unsrt},整份列表就会重新排过。日文文献的排序由 pbibtex / upbibtex 负责(参见 BibTeX 页面)。
biblatex 把这项决定权还给了用户。 与样式无关,只写 \usepackage[sorting=nyt]{biblatex} 就能定下顺序。排序键用字母组合表示:n 表示 name(姓名)、y 表示 year(年份)、t 表示 title(标题)。
| 选项 | 键顺序 | 含义 |
|---|---|---|
nty | name → title → year | 姓名、标题、年份(biblatex 默认) |
nyt | name → year → title | 姓名、年份、标题(作者-年份制常用) |
ynt | year → name → title | 年份、姓名、标题(时间顺序) |
ydnt | year(降序)→ name → title | 从新年份到旧年份 |
none | (不排序) | 正文中的引用顺序(相当于 unsrt) |
总而言之:想保持引用顺序,BibTeX 用 unsrt 样式,biblatex 用 sorting=none。想按字母顺序,BibTeX 用 plain,biblatex 用默认的 nty(作者-年份制则用 nyt)。无论选哪一种,都不需要手动重排 .bib 里的条目。那是工具的活儿;你的活儿只是 准确地记录数据——选对类型、按四段式语法写人名、给必须保住的大写字母加上花括号。遵守这三条的 .bib,会比你此刻正在写的这篇论文活得久得多。