3290 字

参考文献那些事

你能分清BibTeX、Natbib、BiblateX、biber、Better Bib(La)TeX、bst、bbl、bib、ris、csl、sty、cls…吗?如果能,这篇不用看了。最近要把文件迁移到工作电脑里,不得不去整理Zotero。因为我之前用的时候都是想到哪就去尝试,所以不迁移还好,一换新环境就要重新配置插件。这里面我最不愿折腾的就是bib文件,生怕配置错了key一换,后面的编译都出问题。不过我知道有类似体会的肯定不止我一个,那就来考考古,说下参考文献那些事。

参考文献系统是一种论证体系,两个人辩论都会来点名人名言歇后语,写书的话自然更要旁征博引,有时候是为了给读者参考的线索,有时候则是证明自己不是第一个胡说八道的。其实参考文献的证据强度并没变,张三引用李四引用王五的话,说到底还是有源头,如果源头不靠谱,后面就都成了空中楼阁。这个简单的道理常常被畅销书作家忽视,眼下我已经看到很多书在引用《思考,快与慢》里关于启动效应的研究,但那篇研究因为样本量不大,其实被很多人批评过无数次了,只是这并未妨碍一伙知识二道贩子拿来出书论证。其实我认为可以参考的事要么是纯现象论证观点,要么是前人有局限的观点进行理性批判,但最好不要拿观点来论证观点甚至构建理论体系,特别是事实基础不牢靠的观点。当然这又跑题了,技术上看参考文献就是文章中某个点进行标注,然后文末列出参考源。

这样看,当我们处理参考文献时,至少要涉及引用文献的地方与列举文献的地方。当年高德纳想出本书,结果对出版社的排版系统非常不满,所以自己动手开发了TeX,说这个是软件还不如说是一套编程控制语言,这个故事很长,但简单又不负责任地说,老高在写作中混入了排版控制语句,用 \ 来声明开头,然后当排版软件读取混入控制语句的文本后,文本就按照控制语句设计的方式排版进行输出。所以你要有兴趣去读 tex 文件,会发现满屏的控制语句与文本混在一起,但好处就是纯文本文件,写文本的人是知道自己在干嘛的。后来出现 LaTeX 打包了一些常用的控制语句可以直接让作者调用,此时写作者省事了,但对细节的控制权也逐渐交给预定义的软件。这是一个典型用权限换取效率的过程,伴随不断封装,用户的权限不断降低,上手难度不断降低,可以进行的操作就更依赖其他人的扩展包了。所以我常说至少要学一门编程语言,不为别的,起码要知道自己为了换取使用方便而损失的自由度以及你可以实现的自由发挥空间有多大。

LaTeX是处理了排版,但参考文献比较特殊,虽然本来也内置了\cite来标注并定义了一个样式环境来列举文献,但功能非常弱。面对比较复杂的参考文献,BibTeX 是另一套专业的软件,初学 LaTeX ,很多人都对先 latex,然后 bibtex,然后再pdflatex两遍的流程有印象。这背后的逻辑就是第一遍latex找到所有的控制语句锚点生成引文与列举文件地点的 aux 索引(还有交叉引用什么的,暂不讨论),然后 bibtex 根据引文文件键值去读 bib 文件里的文献题录与指定的样式文件 bst 生成 bbl 文献列表,然后再latex一遍把这些内容合并到主文件里,此时 aux 位置会发生变化,引文找不到位置,最后latex一遍根据最新 aux 最终生成需要的输出。需要注意的是 bibtex 只关心列举文献的那一部分,引文那部分需要其他宏包来处理。

这当然不方便,然后就有了natbib,这是个一站式解决参考文献的方案,同时定义了引文格式与管理bibtex题录,基本上你可以用natbib来愉快的写论文了。在 natbib 里,你可以无缝调用一些期刊提供的 bst 样式,例如:

\usepackage{natbib}
\bibliographystyle{stylename}

指定了列举文献的样式,正文中用 \citep\citet 可以支持更多样的引用形式。natbib 充当了bibtex的前端宏包,单纯支持bib文献,对应的文献管理软件,也就是生成bib文件与引文中关键词的工具一般为 JabRef。那么是不是这套方案就完美了呢?

显然不是,如果完美,LaTeX 后面就不会出 XeTeX 了,高大神是说英语的,他并没想到自己这套系统会走向世界,然后就遇到了编码与语言问题。这是两个有联系但其实关系不大的问题,在参考文献的处理上也遇到了类似问题,bib格式本身有限制,这时出现了 biblatex ,刚开始biblatex是为了取代 natbib 设计,后端还用 bibtex 处理目录,在引文设计上引入了万能的 \autocite 来自动判断引文。但 biblatex 为了国际友谊,重新设计了一个 biber 来处理 bib 文件,而且更进一步支持了 ris、endnote xml 等格式,且引文样式与列举文献样式及后端都可以在导言区一步到位设置好(natbib只能设置列举文献样式但相对自由点)。应该说biblatex是新时代的参考文献排版宏包,无奈很多期刊还在坚守 bibtex 的阵地,但因为biblatex是可以调用bibtex作为后端的,所以建议现在打算入坑 LaTeX 排版的直接投奔biblatex的怀抱。

但其实我根本就不建议入坑LaTeX,你得知道管文档类型的cls文件与管文本样式的sty文件等的运作原理,不然学起来会很费劲,然而为了管理文献,你还得学一套biblatex,你不晕我写的都晕。当然现在我们有 latexmk 来掩盖运行三遍 latex 的尴尬,也有 tlmgr 这种管理包的方便工具,但还有 pandoc 啊,这货是各种文档格式转换的利器。在处理参考文献上很简单,只不过 pandoc 引入了另一个参考文献样式:csl。

严格说csl跟pandoc没啥关系,是一套基于xml的引文与列举文献样式的定义,现在主流期刊的定义都能查到,也被 Zotero、 Mendelay 与 papers 这三大文献管理工具所支持。只不过pandoc在处理格式转换时用了csl。当然,需要事先说明的是,pandoc可以进行基于natbib与biblatex的LaTeX相关格式转换的。但很明显csl更简单明了,需要什么期刊就用对应csl编译就可以了,Rmarkdown 就支持这个转换的,在Yaml里写好用什么csl文件就可以了。前面说的文献管理软件也是这样快速转换期刊格式的。当然,肯定有人会去问biblatex的作者能不能也支持csl,不过这就相当于换掉biber的后端重新写一个,而且csl文件对于简单的输入输出是没问题的,比较复杂的情况xml格式本身就会限制住很多复杂情景的实现。

说了这么多,其实更实际的情况应该是markdown写作,csl排版参考文献,有瑕疵手工修改就完了。不过我知道一定有人还会坚守 bibtex/biblatex 阵营,那就顺其自然吧。但说了半天都是排版的事,文献管理该怎样呢?首先,强烈建议使用bib格式来存储参考文献,基本所有管理软件都兼容。其次,就是键值问题,前面说了,你得告诉排版工具引文在哪里,这个控制语句可以做到,但引文对应到bib文件里哪一条就需要一个键值了,这个键值 Zotero 好像用的是哈希值,那玩意跟乱码也差不了多少,所以有人开发了 Better Bib(La)TeX 作为 zotero 的插件来生成人读得懂的键值(不过这就可能出现重复了)。

下面我说下实际操作,用 zotero 收集管理文献生成键值,同步bib文件到论文目录,用 markdown 写论文,需要插入参考文献可以用 fastcopy 的方式直接拷贝或拖拽pandoc支持的键值到文档里,生成的md文档用pandoc直接调用目标期刊 csl 样式进行格式转换,至于说是word还是tex还是网页,看心情就好。当然如果你用 RStudio 与 Rmarkdown,直接安装 citr 包,Zotero 装上 Better Bib(La)TeX, 同步好bib文件,用citr的RStudio插件就可以直接搜索插入参考文献了。如果配合上 rticles 包,那么学术论文在 RStudio 里一站式完成毫无压力(最好搞清楚模版里用的排版文献方式是不是csl,如果不是,Zotero可自定义的拖拽方式可能更好)。

当然,我更看好的还是基于年初说的基于 DOI 跟 crossref 的 API 所进行的快速排版。不过这个只适合重点排版参考文献的情况,例如博客、海报与幻灯片,至于说用这个排版论文,可能差的还比较远。

总结一下:

  • 参考文献的排版需要考虑引用格式与文末文献排列格式

  • BibLatex 同时支持 bibtex 与 biber 后端,natbib 只支持 bibtex 后端

  • 建议使用 biblatex 而不是 bibtex 来排版 tex 文档

  • csl 可以实现参考文献的轻量级排版,可配合 pandoc 使用

  • Rstudio + citr + Zotero + rticles 是个不错一站式 Rmarkdown 论文写作方案

  • 超轻量级的文献排版可以直接考虑DOI与超链接

其实,理解参考文献的排版对于更好使用其他软件也是有帮助的,毕竟你能知道高自由度的编程语言如何针对性解决特定问题。