![如何使用 biber 对 .bib 文件中的条目进行排序](https://linux22.com/image/330417/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20biber%20%E5%AF%B9%20.bib%20%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%9D%A1%E7%9B%AE%E8%BF%9B%E8%A1%8C%E6%8E%92%E5%BA%8F.png)
我的问题类似于如何使用 biber 对 .bib 文件进行排序?
我有一个由 Mendeley 生成的 .bib 文件。由于它是生成的,所以条目没有格式化或排序。而且,每当我在 Mendeley 中添加内容时,顺序就会完全改变。
因为我使用 git 来跟踪更改,所以我想要一个排序并格式化的 bib 文件。这将产生很好的差异/提交,人们可以轻松看到发生了什么变化。
我得到了格式化部分,但我无法让 biber 对文件进行排序。对于我的任务来说,排序参数是什么并不重要,只要对具有相同条目的两个不同文件进行排序会导致相同的排序。因此,让我们假设我们想要根据引用键进行排序。
我目前得到的是:
biber -tool C:\SomePath\unordererd.bib --output_indent=4 --output_fieldcase=lower --output-file=C:\AAAA\SomePath\output.bib
这给了我一个很好的格式,但是条目没有排序。
这是我得到的输出
INFO - This is Biber 2.3 running in TOOL mode
...
INFO - Overriding locale 'en_US' defaults 'variable = shifted' with 'variable = non-ignorable'
INFO - Overriding locale 'en_US' defaults 'normalization = NFD' with 'normalization = prenormalized'
INFO - Sorting list 'none' of type 'entry' with scheme 'none' and locale 'en_US'
INFO - No sort tailoring available for locale 'en_US'
...
显然,biber 考虑了排序,但没有做任何事。我也尝试像在另一个问题中一样提供 biber.conf,但没有成功。
解决方案
如果有人遇到同样的问题,这是我的最终配置文件。它还包括一些用于清理文件的过滤器:
- 它从每个条目中删除
abstract
、file
和keywords
字段mendeley-tags
- 它
url
从某些条目中删除字段
<config>
<sorting>
<presort>mm</presort>
<sort order="1">
<sortitem order="1">title</sortitem>
</sort>
<sort order="2">
<sortitem order="1">year</sortitem>
</sort>
</sorting>
<sourcemap>
<maps datatype="bibtex" map_overwrite="1">
<map>
<map_step map_field_set="ABSTRACT" map_null="1"/>
<map_step map_field_set="FILE" map_null="1"/>
<map_step map_field_set="keywords" map_null="1"/>
<map_step map_field_set="mendeley-tags" map_null="1"/>
</map>
<map>
<per_type>ARTICLE</per_type>
<per_type>BOOK</per_type>
<per_type>inproceedings</per_type>
<per_type>incollection</per_type>
<map_step map_field_set="URL" map_null="1"/>
</map>
</maps>
</sourcemap>
</config>
我还在命令行中添加了这两个参数:
--output_indent=4 --output_fieldcase=lower
答案1
实际上,您使用的 biber 2.3 应该可以与<sorting>
biber.conf 中的合适规范配合使用。2.4 中有一个错误,已在 Sourceforge 上当前的 2.5 dev 版本中修复。正如您的日志所述,工具模式下的默认排序是none
因为如果数据源中有很好的注释等,人们并不总是想更改数据源中事物的顺序。
在你的 .conf 文件中尝试类似这样的操作(使用--configfile=<file>
<config>
<sorting>
<presort>mm</presort>
<sort order="1">
<sortitem order="1">author</sortitem>
</sort>
<sort order="2">
<sortitem order="1">year</sortitem>
</sort>
</sorting>
</config>
这将是完整的命令行:
biber --tool unsorted.bib --output-file=sorted.bib --configfile=biber-sorting.conf
如果文件不在当前文件夹中,则需要正确指定路径。如果您将配置文件命名为biber.conf
,则即使没有参数,biber 也会使用它,--configfile
因为这是默认设置。
答案2
对于使用较新版本的 biber 的人来说,元素名称略有变化。从 biber 2.11 开始,sorting
现在是sortingtemplate name="tool"
。此配置文件对我有用:
<config>
<sortingtemplate name="tool">
<sort order="1">
<sortitem order="1">year</sortitem>
</sort>
<sort order="2">
<sortitem order="1">author</sortitem>
</sort>
<sort order="3">
<sortitem order="1">title</sortitem>
</sort>
</sortingtemplate>
<sourcemap>
<maps datatype="bibtex" map_overwrite="1">
<map>
<map_step map_field_set="ABSTRACT" map_null="1"/>
<map_step map_field_set="FILE" map_null="1"/>
<map_step map_field_set="keywords" map_null="1"/>
<map_step map_field_set="mendeley-tags" map_null="1"/>
</map>
<map>
<per_type>ARTICLE</per_type>
<per_type>BOOK</per_type>
<per_type>inproceedings</per_type>
<per_type>incollection</per_type>
<map_step map_field_set="URL" map_null="1"/>
</map>
</maps>
</sourcemap>
</config>
您可以用以下命令运行:
biber --tool --output-fieldcase=title --output-indent=4 --output-align --output-file=bibliography.bib --configfile=bib-cleanup.conf --validate-config MyCollection.bib
(--validate-config
将断言您的配置文件通过了配置文件的 Relax NG 模式。)
答案3
使用 biber 2.12 时,我需要将journal
字段映射到journaltitle
。否则,该字段将在输出文件中完全消失。这是我的完整配置文件,基于 arprice 发布的文件。
<config>
<sortingtemplate name="tool">
<sort order="1">
<sortitem order="1">year</sortitem>
</sort>
<sort order="2">
<sortitem order="1">author</sortitem>
</sort>
<sort order="3">
<sortitem order="1">title</sortitem>
</sort>
</sortingtemplate>
<sourcemap>
<maps datatype="bibtex" map_overwrite="1">
<!-- Remove fields -->
<map>
<map_step map_field_set="ABSTRACT" map_null="1"/>
<map_step map_field_set="FILE" map_null="1"/>
<map_step map_field_set="keywords" map_null="1"/>
<map_step map_field_set="mendeley-tags" map_null="1"/>
<map_step map_field_set="issn" map_null="1"/>
</map>
<!-- Map journal to journaltitle -->
<map>
<map_step map_field_source="journal" map_field_target="journaltitle"/>
</map>
<!-- Remove URL for specific types -->
<map>
<per_type>ARTICLE</per_type>
<per_type>BOOK</per_type>
<per_type>inproceedings</per_type>
<per_type>incollection</per_type>
<map_step map_field_set="URL" map_null="1"/>
</map>
<!-- Map annote to note -->
<map>
<map_step map_field_source="annote" map_field_target="note"/>
</map>
</maps>
</sourcemap>
</config>