扩展数据模型以允许在工具模式下使用 biber 自定义字段

扩展数据模型以允许在工具模式下使用 biber 自定义字段

我想扩展的biber数据模型,即我想biber接受诸如review或之类的字段owner作为所有条目类型的有效输入字段。

(注:这是不是关于在文档中使用这些字段的数据,我也不想将自定义字段映射到现有字段例如useracustoma。如果您想知道我为什么问这个问题,请参阅下文(“背景”)。

在工具模式下使用,我通过以下方式biber扩展了默认配置文件(用找到):biber --tool-conf

<config>
<!-- skipped 383 lines -->
  <datamodel>
    <!-- skipped "constants" and "entrytypes" --> 
    <fields>
      <!-- skipped all predefined fields --> 
      <field fieldtype="field" datatype="literal">owner</field>
      <field fieldtype="field" datatype="literal">review</field>
    </fields>
    <entryfields>
      <field>owner</field>
      <field>review</field>
    <!-- skipped remainder of file -->
    </entryfields>
  </datamodel>
</config>

完整修改版已上传biber.conf至 pastebin.com

据我所知,这是“有效的”,即biber --tool input.bib用这个运行input.bib

@REPORT{Self2016,
  YEAR      = {2016},
  AUTHOR    = {Self, My},
  TITLE     = {The title},
  OWNER     = {Me},
  REVIEW    = {Important stuff.}
}

不会通过修改配置文件来删除review和字段(而默认配置会删除这些字段)。owner

我的问题是: 为什么这有效吗?我或多或少通过反复试验找到了这个解决方案。我想添加<field ...>in<fields>表示biber这样的字段可能存在。实际上,仅此配置扩展即可发挥作用。我进一步假设下面的条目<entryfields>使新字段成为全部条目类型。如果我跳过此部分,则biber当我使用 调用它时会出现错误--validate-datamodel

你能告诉我我的假设是否正确,并帮助我理解在哪里可以找到这个比伯或者比布拉特克斯手册?我认为biblatex手册中的 §4.5.4 非常相关,但是有没有文档说明那里记录的 LaTeX 命令与 XML 结构有何关系biber.conf

此外,这是扩展数据模型的正确方法吗?还是我做错了,但测试用例太简单而无法揭示这一点?


背景:我使用 JabRef 来管理我的参考文献。有时,我会使用 JabRef 的“审阅”选项卡来注释条目。这些注释保存在review相应条目的字段中。有时,我会biber在 BIB 文件上运行工具模式,以便获得干净的格式、排序并应用一些其他转换。这在过去很有效,但从 biber 2.6 开始,biber 会丢弃自定义条目字段。这是我报告的内容Github 上@plk 建议我扩展数据模型。

答案1

您的假设是正确的。字段元素描述了允许的字段。Biber 使用它来决定是否允许该字段。数据模型的其他方面用于验证。.conf文件数据模型格式并没有真正记录下来,因为人们很少在工具模式下使用自定义数据模型。用于数据模型操作的 biblatex 宏将您看到的 XML 写入文件.bcf(但带有bcf:命名空间)。

答案2

我遇到了完全相同的问题,而且我真的不想维护我自己的 Biber 配置文件版本。我注意到在默认数据模型中,有许多我从未使用过的字段定义,包括userauserblista所以listb我的解决方法是将我的自定义字段(在本例中是以 开头的字段OPT,我想保留这些字段)重命名为这些预定义字段,在工具模式下运行 Biber,然后将它们重命名回来。这是一个执行此操作的小 Bash 脚本:

# Define replacements (each will be prefixed with 'OPT')
FIND=(address booktitle doi   editor isbn  issn  location month note  url)
REPL=(usera   userb     userc userd  usere userf lista    listb listc listd)
IXS=`seq 0 $((${#FIND[*]} - 1))`

# Input and output file
FILE=refs.bib

# Replace forward
for i in $IXS; do
  sed -i '' s/OPT${FIND[$i]}/${REPL[$i]}/ $FILE
done

# Biber
biber --tool --output-file=$FILE $FILE

# Replace back
for i in $IXS; do
  sed -i '' s/${REPL[$i]}/OPT${FIND[$i]}/ $FILE
done

相关内容