一些 bibtex 数据库操作的命令行工具

一些 bibtex 数据库操作的命令行工具

灵感来自一个答案另一个问题让我想起了为什么只有一个 BIB 文件很困难的各种原因。我希望有一套命令行工具,我可以编写脚本来获取我的“主”BIB 并将其转换为特定情况。我知道比布工具它可能足够强大,可以满足我的大部分需求,但我还不知道如何使用它......

以下是一些可以通过这种方式自动化的常见任务。当然,战略目标可以通过使用更智能的 BST(或类似 biblatex 的东西)以“正确的方式”解决,但通常人们会受到限制(或者至少是很多更方便的是使用发布者损坏的 BST 并对数据库进行一些调整:

  1. 截断所有作者超过 5 位的论文,只保留被截断论文的前 3 位作者(因为空间不足)
  2. 删除一个字段(月份、网址、ISSN、ISBN),因为期刊的 BST 损坏,导致这些字段混乱
  3. 有条件地删除字段(例如,仅删除文章的标题,但不删除书籍的标题)
  4. 展开/折叠@string 引用(例如,我有 2 个文件,一个apsjour.bib带有
    @STRING{prl = {Phys. Rev. Lett.}}
    ,一个fulljour.bib带有
    @STRING{prl = {Physical Review Letters}}
    ,因此我可以根据需要编写\bibliography{apsjour,articlebib}\bibliography{fulljour,articlebib},但我当然不希望我的合著者处理这个惯例。
  5. 从s 中删除带有页码的archiveprefix, eprint,primaryclass@article
  6. 删除DOI包含奇怪字符的 s,因为 documentclass 没有进行足够的转义(说真的,Wiley,是
    10.1002/(SICI)1521-3978(200005)48:5/7<531::AID-PROP531>3.0.CO;2-#
    真的对于需要以 URL 结尾的内容,这是一个好主意吗?
  7. 如果一个工具足够灵活,能够完成更复杂的任务,那就太好了,只要这种灵活性不以牺牲可用性为代价(参见比布工具
  8. 可能还有其他用例我暂时忘记了。我感觉我永远都在对 bibtex 数据库进行针对期刊甚至针对论文的修改。贾布雷夫使其相当容易,但是仍然......

CTAN 上有很多可爱的工具tex-archive/biblio/bibtex/utils但我觉得必须在其他地方严肃的工具隐藏。我不可能是唯一一个遇到这些问题的人,对吧?(请告诉我我的方法不对,并让我知道你在不使用命令行工具的情况下处理上述问题的个人策略!这包括,正如 Jukka Suomela 在他的回答中所建议的,用于编辑生成的 BBL 文件而不是编辑 BIB 的工具。)

以下是一些我已经知道的解决方案的问题:

  1. 处理 AUX 文件以仅保留引用的条目(许多解决方案,包括比贝提取物
  2. 合并 BIB 文件并删除重复项(皮比布
  3. 强制使用特定格式的页面范围(1234-56 或 1234-1256)(bibfile-重新格式化页面

答案1

看看 biber,SourceForge 上当前的 1.5 dev 版本有一个新的“工具”模式,允许您独立于 biblatex 使用 biber 的重新编码和源映射功能。源映射功能是您从描述中主要需要的,这些都在 PDF 手册中记录了。如果您有具体问题,我可以提供具体示例。biber 将执行您上面提到的所有操作,除了可以添加的 @string 扩展,但正如您所说,它相当特殊。

当然,您也可以使用 biber 动态执行此操作 - 在读取 .bib 时应用更改,但不触及 .bib。新工具模式允许您将更改的 .bib 写入另一个文件,而无需写入 .bbl。

例如,以下是在工具模式下处理示例中的第 2、3、5 和 6 点的方法。使用 biblatex 及其最大/最小名称选项可以更好地从语义上处理第 1 点。使用以下命令创建 biber.conf:

<config>
  <sourcemap>
    <maps datatype="bibtex" map_overwrite="1">
      <map>
        <map_step map_field_set="issn" map_null="1"/>
      </map>
      <map>
        <per_type>ARTICLE</per_type>
        <map_step map_field_set="title" map_null="1"/>
      </map>
      <map>
        <per_type>ARTICLE</per_type>
        <map_step map_field_source="pages" map_final="1"/>
        <map_step map_field_set="archiveprefix" map_null="1"/>
        <map_step map_field_set="eprint" map_null="1"/>
        <map_step map_field_set="primaryclss" map_null="1"/>
      </map>
    </maps>
    <map>
      <map_step map_field_source="doi" map_match="[\\;]" map_final="1"/>
      <map_step map_field_set="doi" map_null="1"/>
    </map>
  </sourcemap>
</config>

然后运行 ​​biber

biber --tool file.bib

它将在您的默认位置查找biber.conf并输出一个名为 的文件file_bibertool.bib

正如我所说的,这也是可能的,当您使用 biber 将文件正常处理为 .bbl 时,可以动态地使用 biber.conf,并且整个映射功能也可以通过宏在 biblatex 中使用(请参阅 biblatex 文档中的 \DeclareSourcemap)如果您想在每个文档的基础上动态地执行此操作。

答案2

我从来没有遇到过这样的情况必须提供一个可以与期刊提供的 BST 文件完美编译的 Bibtex 文件。你真的需要这么做吗?

对于会议和期刊投稿,通常只需发送 PDF 文件,而不是源代码。对于最终版本,根据我的经验,通常只需提供 Latex 源代码就足够了,其中我已经用 Bibtex 生成的 *.bbl 文件的内容替换了 \bibliography 命令。

没人会看到如何我创建了 *.bbl 文件,所以我可以做任何我想做的事情:

  • 拿期刊提供的 BST 文件来做些修改。简单地从 BST 文件中删除一些有缺陷的部分可能比调整 Bibtex 数据库要快得多。如果您需要经常处理同一个有缺陷的 BST 文件,那么这种方法就很有意义了。

  • 只需获取最终的 *.bbl 文件并直接编辑即可。这对于处理某些一次性特殊情况特别有用。

我用来处理一些非常特殊情况的另一个技巧是在我的 Bibtex 数据库中为同一篇论文设置两个条目(显然使用不同的键,如“foo”和“foo2”)。如果您想逐个决定在哪篇论文中使用哪个版本,而不考虑其他问题(例如不同的 BST 文件),这将非常有用。

答案3

我不知道有任何非程序员工具可以完成你要求的那些事情,所以我认为你需要一个 bib 脚本工具包,而 pybib 是其中最常用的。如果你不熟悉 python 但知道 perl,那么宝莱坞可能更适合你。

答案4

我认为也许这个项目教皇为您提供您正在寻找的正是它。它是一个非常可扩展的命令行文档管理器,您还可以使用与 git 的脚本功能非常相似的方法编写脚本。

还有相当广泛的文献

http://papis.readthedocs.io/en/latest/scripting.html

以及一些脚本示例

https://github.com/alejandrogallo/papis/tree/master/examples/scripts

您可以使用本机 Python 库有条件地轻松删除字段,例如删除所有 url 键:

import papis.api

documents = papis.api.get_documents_in_lib()
for doc in documents:
    if "url" in doc.keys():
          del doc["url"]
          doc.save()

以及更多。

相关内容