用正则表达式替换 biblatex/biber 以消除警告“月份不是整数……”

用正则表达式替换 biblatex/biber 以消除警告“月份不是整数……”

biblatex我从 TL2018开始使用Mendeleybiber进行博士论文撰写。由于各种原因,我不得不使用它Mendeley进行引文管理,现在无法切换到其他工具。Mendeley 能够生成bib- 但它与仅有的经典natbib/bibtex组合(尽管它正确地转义了特殊字符)。

我理解,对于biblatex/biber组合,month字段不是字符串,而必须是整数。因此,正如预期和讨论的那样,这里,我收到警告

 [784] Utils.pm:193> WARN - month field 'Apr' in entry 'coolauthor2012' is not an integer - this will probably not sort properly.

从一个无关的问题中获取灵感这里month -> integer,我在序言中使用了以下手动转换。

\DeclareSourcemap{
    \maps[datatype=bibtex]{
        \map[overwrite]{
            \step[fieldsource=month, match={jan}, replace=${1}]
            \step[fieldsource=month, match={feb}, replace=${2}]
            \step[fieldsource=month, match={mar}, replace=${3}]
            \step[fieldsource=month, match={apr}, replace=${4}]
            \step[fieldsource=month, match={may}, replace=${5}]
            \step[fieldsource=month, match={jun}, replace=${6}]
            \step[fieldsource=month, match={jul}, replace=${7}]
            \step[fieldsource=month, match={aug}, replace=${8}]
            \step[fieldsource=month, match={sep}, replace=${9}]
            \step[fieldsource=month, match={oct}, replace=${10}]
            \step[fieldsource=month, match={nov}, replace=${11}]
            \step[fieldsource=month, match={dec}, replace=${12}]
        }
    }
}

我现在有两个困扰我的问题。

  1. 这会起作用吗?我没有看到上述任何警告,但我想知道引用是否正确排序,并且月份替换确实得到考虑和正确处理。
  2. 有没有更好的方法来处理这个问题?显然,手动将每个月映射到整数是低效的。

这将帮助所有想要使用mendeley现有mendeley图书馆的人,尤其是那些想要向大多落后于natbib/bibtex时代的出版商提交手稿的人。

答案1

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map[overwrite]{
      \step[fieldsource=month, match=\regexp{\A(j|J)an(uary)?\Z}, replace=1]
      \step[fieldsource=month, match=\regexp{\A(f|F)eb(ruary)?\Z}, replace=2]
      \step[fieldsource=month, match=\regexp{\A(m|M)ar(ch)?\Z}, replace=3]
      \step[fieldsource=month, match=\regexp{\A(a|A)pr(il)?\Z}, replace=4]
      \step[fieldsource=month, match=\regexp{\A(m|M)ay\Z}, replace=5]
      \step[fieldsource=month, match=\regexp{\A(j|J)un(e)?\Z}, replace=6]
      \step[fieldsource=month, match=\regexp{\A(j|J)ul(y)?\Z}, replace=7]
      \step[fieldsource=month, match=\regexp{\A(a|A)ug(ust)?\Z}, replace=8]
      \step[fieldsource=month, match=\regexp{\A(s|S)ep(tember)?\Z}, replace=9]
      \step[fieldsource=month, match=\regexp{\A(o|O)ct(ober)?\Z}, replace=10]
      \step[fieldsource=month, match=\regexp{\A(n|N)ov(ember)?\Z}, replace=11]
      \step[fieldsource=month, match=\regexp{\A(d|D)ec(ember)?\Z}, replace=12]
    }
  }
}

这将用正确的月份数字替换三个字母的名称缩写或完整的月份名称。由于 Biber 的 RegExp 区分大小写,因此它将匹配小写的月份缩写和首字母大写的版本(即janJan)。(biber2.12 及更高版本支持matchi不区分大小写的匹配;请参阅这个问题

这只是为了抑制 Biber 在遇到以下情况时发出的警告

month = {mar},

即使没有此代码,月份也会被正确识别。


请注意,对于大多数 BibTeX 样式来说,month = {mar},这也不是最佳(正确)的输入形式。无括号month = mar,通常更好,因为它随后会通过 BibTeX 字符串转换为所需的输出。BibTeX 提示和常见问题

Q13:我应该使用文字还是数字来表示月份、版本等字段?为什么?

您应该始终使用三个字母的月份宏(未分隔)作为月份名称(jan,,,,,,,,,,,,,)feb,因为这允许每个文件按照该书目样式的要求格式化月份名称。maraprmayjunjulaugsepoctnovdec.bst

BTX文档第 10 页

month作品出版的月份,或未出版作品的创作月份。应使用标准的三字母缩写,如 LaTeX 手册附录 B.1.3 中所述

也可以看看https://www.ece.ucdavis.edu/~jowens/biberrors.html

相关内容