这个问题是关于在这个答案。避免这种副作用的一种方法是不使用 biber,但bibtool -biblatex
正如这个答案。
我使用biber --tool
它来自动从 .bib 文件中的 biblatex 条目中删除诸如abstract
、review
、groups
和 之类的字段file
。这样做的副作用是所有非标准字段¹似乎也被删除了,我想防止这种情况发生。这是一个最简单的例子:
这是.bib 文件中的条目mybib.bib
:
@Thesis{Author_18_TheThesis,
author = {Mr Author},
title = {The Thesis},
type = {Doctoral Dissertation},
institution = {Department of Documents, University of Stackexchange},
year = {2018},
abstract = {This is the abstract.},
file = {:author/Author_18_TheThesis.pdf:PDF},
review = {This is the review.},
groups = {publications},
ispreprintpublic = {true},
}
这是clean-bibfiles.conf
配置文件biber --tool
:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<output_fieldcase>lower</output_fieldcase>
<output_indent>2</output_indent>
<output_align>true</output_align>
<sourcemap>
<maps datatype="bibtex" map_overwrite="1">
<map map_overwrite="1">
<map_step map_field_set="abstract" map_null="1"/>
<map_step map_field_set="review" map_null="1"/>
<map_step map_field_set="groups" map_null="1"/>
<map_step map_field_set="file" map_null="1"/>
</map>
</maps>
</sourcemap>
</config>
运行biber --tool --configfile=clean-bibfiles.conf mybib.bib
将生成一个mybib_bibertool.bib
包含此 biblatex 条目的文件:
@thesis{Author_18_TheThesis,
author = {Author, Mr},
institution = {Department of Documents, University of Stackexchange},
date = {2018},
title = {The Thesis},
type = {Doctoral Dissertation},
}
非标准字段ispreprintpublic
已从条目中删除。确切地说,即使groups
和review
字段不在源映射中,它们也将被删除,因为它们也是非标准字段或分别从文章类型“借用”。如何在使用时防止自动删除此类字段biber --tool
?
¹参见“2.1.1 常规类型”和“4.2.4.1 通用字段”biblatex 文档。
答案1
确实,biber
不处理不属于数据模型的字段,因此如果您的数据源具有非标准字段或条目类型,则必须提供biber
包含它们的数据模型。
但是,在继续执行此任务之前,最好先了解所需的默认数据模型中实际缺少什么。您可以使用以下选项来做到这一点--validate-datamodel
:
biber --tool --validate-datamodel mybib.bib
在包含该条目的 .bib 文件中,会出现以下警告:
WARN - Datamodel: Entry 'Author_18_TheThesis' (mybib.bib): Field 'review' invalid in data model - ignoring
WARN - Datamodel: Entry 'Author_18_TheThesis' (mybib.bib): Field 'groups' invalid in data model - ignoring
WARN - Datamodel: Entry 'Author_18_TheThesis' (mybib.bib): Field 'ispreprintpublic' invalid in data model - ignoring
这让您准确地知道您必须包含字段和review
数据模型。groups
ispreprintpublic
(当然,将review
和添加groups
到数据模型然后将它们放在源映射中并不是“通常的做法”。我只是为了通用性和程序性而在这里这样做。)
要设置您的自定义biber-tool.conf
文件(您将其称为clean-bibfiles.conf
,让我们保持这种状态,但通常还有其他操作可以通过此过程实现),您必须调整数据模型以将非标准字段的行包含在组中<fields>...</fields>
。 在您的例子中(假设这些是“文字”类型字段):
<field fieldtype="field" datatype="literal">review</field>
<field fieldtype="field" datatype="literal">groups</field>
<field fieldtype="field" datatype="literal">ispreprintpublic</field>
并在组内<entryfields><entrytype>thesis</entrytype>...</entryfields>
添加:
<field>review</field>
<field>groups</field>
<field>ispreprintpublic</field>
结果clean-bibfiles.conf
应该是:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<output_fieldcase>title</output_fieldcase>
<output_indent>2</output_indent>
<output_align>true</output_align>
<sourcemap>
<maps datatype="bibtex" map_overwrite="1">
<map map_overwrite="1">
<map_step map_field_set="abstract" map_null="1"/>
<map_step map_field_set="review" map_null="1"/>
<map_step map_field_set="groups" map_null="1"/>
<map_step map_field_set="file" map_null="1"/>
</map>
</maps>
</sourcemap>
<datamodel>
<fields>
<field fieldtype="field" datatype="literal">review</field>
<field fieldtype="field" datatype="literal">groups</field>
<field fieldtype="field" datatype="literal">ispreprintpublic</field>
</fields>
<entryfields>
<entrytype>thesis</entrytype>
<field>review</field>
<field>groups</field>
<field>ispreprintpublic</field>
</entryfields>
</datamodel>
</config>
有了这个配置文件,命令:
biber --tool --validate-datamodel --configfile=clean-bibfiles.conf mybib.bib
将输出mybib_bibertool.bib
所需的条目:
@Thesis{Author_18_TheThesis,
Author = {Author, Mr},
Institution = {Department of Documents, University of Stackexchange},
Date = {2018},
Ispreprintpublic = {test},
Title = {The Thesis},
Type = {Doctoral Dissertation},
}
要检查默认数据模型和配置,您可以使用以下命令找到默认位置biber-tool.conf
:
biber --tool-config
这可能不是特别简单。但是,引用 PLK 的话评论以上:“在工具模式下拥有数据模型的好处大于这类问题。”