Academic Writing

BibTeX 与 BibLaTeX 解析

BibTeX 和 BibLaTeX 将引文存储在类似的文件中,但它们处理和格式化这些数据的方式完全不同。这里说明真正区分二者的后端差异,BibLaTeX 为何更好处理非英语和非常规来源,以及切换的实际成本。

5 min
Table comparing BibTeX vs BibLaTeX by formatting logic, backend processor and Unicode support

一名博士生打开导师旧的 LaTeX 论文模板,准备开始撰写自己的论文,却发现旁边放着一个 References.bib 文件,以及一个指向 apalike 的 bibliographystyle 命令。他完全不知道这两者各自使用什么引文系统。文件夹里没有任何内容能直接说明这一点,而且,模板的原作者如今已经远在三个博士后和一个大洲之外。

BibTeX 与 BibLaTeX 才是隐藏在这种困惑之下的真正问题。它们都把引文数据存放在类似的文件中,但处理、格式化并输出这些数据时,所用的机制完全不同。知道一篇文档已经使用了哪一种,以及切换之后究竟会改变什么,区别就在于,是花一个下午困惑不解,还是花一个下午专心写作。

正确引用来源从来只是参考文献格式问题的一半,而 TextPulse 自己的 参考文献格式指南 所覆盖的另一半,远远超出任何单一排版系统。这篇文章只聚焦于这个问题在 LaTeX 中的特定分支, BibTeX 还是 BibLaTeX,以及它们究竟有何区别。

BibTeX 与 BibLaTeX, 分界究竟发生在哪里

BibTeX 是这两种系统中较早的一种,而且它一次完成两项工作。它读取 .bib 文件中的数据,并在一个单独的样式文件 .bst 文件的指导下,将这些数据格式化为最终的参考文献列表。该 .bst 语言规模很小,专门为这一项工作而设计,这也正是它的局限, 要将它扩展到覆盖原作者从未计划过的来源类型,本身就是一种专门技能。

BibLaTeX 将这两项工作分开。格式化发生在 LaTeX 本身内部,由文档自身导言区中的普通 LaTeX 宏控制,而不是由单独的样式文件控制。数据处理,即读取、排序并为输出准备 .bib 文件中的条目,则由一个名为 Biber 的专用后端程序处理,BibLaTeX 在编译期间会自动调用它。BibTeX 以一步完成处理和格式化, BibLaTeX 则将这两项工作分配给 LaTeX 宏和 Biber。正是这种架构上的分离,才是真正区分它们的原因。

BibTeXBibLaTeX
格式化逻辑单独的 .bst 样式文件文档内部的 LaTeX 宏
后端处理器BibTeX 本身,一步完成Biber,在编译时自动运行
Unicode 支持没有原生支持完整支持
多语言参考文献需要附加包内置,遵循文档的语言设置
典型导言区调用bibliographystyle 加 bibliographyusepackage biblatex 加 addbibresource

为什么 BibLaTeX 更好地处理非英语和不常见来源

Unicode 差距本身就解释了大部分非英语问题。BibTeX 没有原生 Unicode 支持,因此作者姓名或标题中只要包含基本拉丁字符集之外的字符,就必须先采用变通方法。BibLaTeX 的 Biber 后端支持完整的 Unicode,因此带重音的字符、非拉丁文字以及来源原始语言中的其他任何内容,都可以直接写入 .bib 文件,并以正确格式输出。

语言处理不仅限于单个字符。BibLaTeX 会自动调整连接词,例如 edition 或 editor,以匹配文档通过 babel 或 polyglossia 设置的语言,而且它吸收了过去分散在若干独立附加包中的功能,这些附加包用于多语言或多部分参考文献。经典 BibTeX 样式通常是为一种语言编写的,几乎总是英语,因此引用法语或德语来源的文档传统上需要额外的包来处理这一点。

该论断的后半部分来自同样的架构分离。BibLaTeX 将格式化规则保存在 LaTeX 宏中,而不是一个专门设计的小型样式语言中,因此它默认能够支持更广泛的条目类型。这些类型包括在线资源、数据集和多卷著作等来源,而这些在 BibTeX 的原始设计中从未被考虑。引用数据集、预印本或仅在线发布报告的研究者,通常会发现 BibLaTeX 已经为其内置了相应的条目类型,而 BibTeX 工作流程则意味着要把现有类型,通常是包罗万象的 miscellaneous 类型,改造成适配所需。

将你自己的论文人性化

改写你的 AI 辅助文本,使其听起来更像人工撰写,同时不改动重要词语或引文。

免费开始

如何判断文档已经在使用哪一种

导言区几秒钟就能说明问题。加载 biblatex,并且有一行 addbibresource 指向 .bib 文件的文档,运行的是 BibLaTeX。相反,如果文档在文件末尾附近调用 bibliographystyle,随后是 bibliography,而导言区中完全没有提到 biblatex,那么运行的就是经典 BibTeX。

  • 在导言区中搜索 biblatex 这个词。如果它出现在包加载行中,文档使用的是 BibLaTeX。
  • 查找 addbibresource。它只存在于 BibLaTeX 中,经典 BibTeX 则使用 bibliography。
  • 检查构建过程调用了哪个程序。BibLaTeX 文档在编译序列中需要运行 Biber,而不是 BibTeX。
  • 检查正文中的引文命令。parencite 和 textcite 只属于 BibLaTeX, cite 单独使用时两者都可用,这也是为什么要先检查导言区。

从 BibTeX 切换到 BibLaTeX 实际上要付出什么代价

.bib 文件本身在切换后几乎可以原样保留,因为这两个系统读取的是同一种底层条目格式。大多数字段都可以直接沿用,而 BibLaTeX 也接受 BibTeX 的原始字段名作为别名,尽管它还提供了更精确的替代方案,例如用一个日期字段代替分别的年份和月份字段。

一旦文档的引文系统已经确认,用 专用的 bibtex generator 生成任何新条目的正确格式,要比凭记忆直接输入原始字段更容易,尤其是对于那种在整篇文档中只出现一次的来源类型。

真正的成本在于导言区和构建链,而不在数据本身。bibliographystyle 和 bibliography 需要替换为 biblatex 和 addbibresource,任何从 natbib 借用的引文命令都需要对照 BibLaTeX 自身的对应命令进行检查,并且需要告诉编译器或编辑器在构建过程中运行 Biber,而不是 BibTeX。最后这一步最容易出问题, 编辑器如果仍然配置为旧的构建顺序,就会生成一篇完全没有参考文献的文档,而且不会有错误信息指出真正的原因。

这些都不难,一旦识别出来,问题恰恰就在这里。每一部分都是一个小而且有充分文档说明的改动,但一个在没有解释的情况下继承下来的模板,往往会在第一个环节,也就是构建步骤,悄无声息地失败,甚至在作者看到引文本身是否能够正常工作之前就已经出错。

你应该切换,还是让一个可用的模板保持不变?

如果你已经在生成一个使用经典 BibTeX 的文档, 也就是不需要新功能, 只引用英文来源,并且从不需要除文章、书籍和会议论文之外的来源类型,那么在项目进行到一半时切换的理由并不充分。一个距离截止日期只有两个月的可用论文模板,不适合在这里承担上面的迁移成本。

一个以多种语言引用来源、从数据集、网站或其他非标准来源类型中取材,或者因为其原作者已经围绕 BibLaTeX 构建而被继承下来的文档,是另一种情况。在那里,问题不在于是否切换,而在于该文档是否曾经真正运行过经典 BibTeX,这正是上文前导部分检查的目的。

为不同期刊重新格式化参考文献列表有单独的页面,带注释书目与文献综述之间的区别也是如此。

不过,并非每个引文问题都是 LaTeX 问题。一个直接从出版商记录中提取参考文献的引文生成器,对于使用 Word 而不是 LaTeX 的任何人来说,都解决了同样的底层任务,而无需 .bst 文件或 Biber 运行。

XLinkedInFacebook

常见问题

BibTeX 与 BibLaTeX 的区别在于格式化工作发生的位置。BibTeX 自行读取并格式化引文数据,由单独的 .bst 样式文件进行指导。BibLaTeX 则将这项工作拆分开来, 一个名为 Biber 的后端程序处理数据,而格式化由文档中的普通 LaTeX 宏控制。正因为这种拆分,BibLaTeX 更容易处理 Unicode、多种语言和非常规来源类型。

Sara

Content planner and copywriter at TextPulse. Sara runs the blog day to day, from planning and drafting through to publishing. She writes the practical guides: clear explanations of academic writing problems, aimed at the person who actually has to hand something in.