从 BibTex 文件生成纯文本的参考文献列表

我平时还是更喜欢使用 BibTeX 来处理参考文献,好处是内容和样式分离,同样的数据, 可以根据不同情景使用不同的 bst 文件生成不同样式的参考文献。

举个例子,对于

@article{cardwell2016bbr,
  title     = {BBR: Congestion-based congestion control: Measuring bottleneck bandwidth and round-trip propagation time},
  author    = {Cardwell, Neal and Cheng, Yuchung and Gunn, C Stephen and Yeganeh, Soheil Hassas and Jacobson, Van},
  journal   = {Queue},
  volume    = {14},
  number    = {5},
  pages     = {20--53},
  year      = {2016},
  publisher = {ACM New York, NY, USA}

这个文献,如果使用 APA 样式,就会长这样

Cardwell, N., Cheng, Y., Gunn, C. S., Yeganeh, S. H., & Jacobson, V. (2016). BBR: Congestion-based congestion control: Measuring bottleneck bandwidth and round-trip propagation time. Queue, 14(5), 20–53.

如果使用 GB7714 样式,那就长这样

[1] CARDWELL N, CHENG Y, GUNN C S, et al. BBR: Congestion-based congestion control: Measuring bottleneck bandwidth and round-trip propagation time[J]. Queue, ACM New York, NY, USA, 2016, 14(5): 20–53.

我不怎么用 word 写东西,但有时候我需要把一堆参考文献贴到 word 或者 ppt 上面。 由于我认为目前的文献管理软件都特别丑,我并没有用这些软件的习惯,都是通过 BibTex 来生成参考文献列表。

下面分享一下我在这方面的经验。

从 pdf 复制

最初我的处理方式是建一个简单的 LaTeX 项目,输出参考文献列表,生成 pdf 后复制参考文献到 word 里面。

比较直观,但是从 pdf 直接复制内容出来,懂的都懂,非常难受。

后面我就开始去找有没有直接生成像上面那样的 plain text 的方法,目前找到了两个还算好使的方法。

pdf 转 html

有许多 pdf 转 html 或者 bib 转 html 的小脚本或者软件,看官网都有点年头了。 我尝试用了 bibtex2html 发现对中文和 gb7714 支持都不太好, 导出的文献列表并不是数字类型的,看起来很乱,可能哪里参数没搞对,就没再深究放弃了这个方案。

使用 citation.js 导出

我其实首先找到的是 Bibtex Converter 这个项目,后面发现它使用的是 citation.js 这样一个库。

轻度使用的话可以直接用它线上进行转换,界面用起来比较方便了,除了常见样式也可以自定义, 而且不仅可以导出纯文本, 还可以是 word 和 pdf ,不过我试了一下如果不是导出纯文本,对中文的支持基本上没有。

后面发现 Citation.js 其实也有个命令行,但我后面用下面的方案了,就没再尝试。

使用 hayagriva 导出

typst 是前段时间比较火的一个项目,我感觉还不成熟就没仔细用过,对于它就不细说了。 这里主要想说的是由于它是一个排版软件,它的出现也丰富了 rust 在文献管理方面的生态。

hayagriva 是这个团队搞的一个文献管理的库,同时也提供了 简单的命令行程序,通过它可以在命令行里实现类似上面 Bibtex Converter 的功能。

在样式方面上述两个项目都是依赖 CSL 这种文件格式,描述了导出的参考文献的应该长什么样子。 可以从 mendeley 的 这个地方 搜索,并下载相应的样式文件,看起来是 xml 格式的。

使用方法

安装很简单,根据官方文档说的

cargo install hayagriva --features cli

我的使用方法就是先下载样式文件,然后:

hayagriva ref.bib reference --locale "zh-CN,en-US" --csl gb7714-numeric.csl -n > some.txt

属于最基础的用法,应该还有很多更高端的功能我暂时用不到。

由于不是很成熟,hayagriva 用起来也有一些问题:

  1. 样式并不是完全支持的,有时候导出的文本缺少一些内容,比如 gb7714 里 [R] 的样式没有按照标准导出时间这个参数
  2. locales 支持还不完善,比如在英文中文文献都有的时候 “等” / “et al.” 可能只支持一种,不能很灵活地自动处理
  3. 数字编号后总是换行,我也不知道是因为什么,这两个项目都是这样。我是导出后用 vim 手动处理下, 删掉数字编号,只复制内容,用 word 里的重新编号。

总结

如果不嫌麻烦,最稳妥的方式还是生成 pdf 再把参考文献列表复制出来,格式上应该是最正确的。 其他方案也可以尝试,但要注意它们生成的内容可能是有问题的