如何使用 biber 对 .bib 文件中的条目进行排序

如何使用 biber 对 .bib 文件中的条目进行排序

我的问题类似于如何使用 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,但没有成功。

解决方案

如果有人遇到同样的问题,这是我的最终配置文件。它还包括一些用于清理文件的过滤器:

  • 它从每个条目中删除abstractfilekeywords字段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>

相关内容