清除字段,当且仅当内容不等于特定字符串

清除字段,当且仅当内容不等于特定字符串

我正在尝试通过通常的构造清除 BibLaTeX 字段\DeclareSourcemap,如§4.5.3

具体来说,在大多数情况下,以下操作对我来说都是正确的,并导致pubstate被清除:

\DeclareSourcemap{
  \maps[datatype=bibtex, overwrite]{
      \step[fieldset=pubstate, null]
  }
}

但是,我希望包含特定pubstate, \bibstring{submitted}, 的条目不是得到清除,但对于所有其他人(例如那些有的pubstate = {\bibstring{prepublished}})确实得到清除。

bibstring暂时忽略复杂性(虽然我在包含它时也尝试过,在我现在的情况下它只是变成了“已提交”),我尝试了以下操作,但没有成功:

\step[fieldset=pubstate, notmatch=\regexp{[Ss]ubmitted}, null]

在上述正则表达式中添加.*前缀和后缀,或添加和删除分组似乎也无效。我还尝试使用 和 的各种组合matchreplace使用和不使用多个\step命令来实现这一点,或者改为通过 来实现fieldsource

有人可以建议我如何才能最好地实现这一目标吗?

答案1

match记录在biblatex手动的,第 178 页,

如果match已定义但replace未定义,则仅当与 正则表达式fieldsource <entryfield>匹配时才应用该步骤match(如果使用,则逻辑相反notmatch)。

因此 amatch需要 afieldsource而不是 a fieldset。这意味着你的一行代码无法工作,需要扩展为两行代码

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[style=authoryear, backend=biber]{biblatex}

\DeclareSourcemap{
  \maps[datatype=bibtex, overwrite]{
    \map{
      \step[fieldsource=pubstate, notmatch={[sS]ubmitted}, final]
      \step[fieldset=pubstate, null]
    }
  }
}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{appleby,
  author   = {Humphrey Appleby},
  title    = {On the Importance of the Civil Service},
  date     = {1980},
  pubstate = {prepublished},
}
@book{elk,
  author    = {Anne Elk},
  title     = {A Theory on Brontosauruses},
  year      = {1972},
  pubstate  = {submitted},
}
\end{filecontents}

\addbibresource{\jobname.bib}

\begin{document}
\cite{elk,appleby}
\printbibliography
\end{document}

Appleby, Humphrey (1980)。《论公务员制度的重要性》。//Elk, Anne (1972)。《关于雷龙的理论》。已提交。

未来版本的biblatexBiber 将不区分大小写notmatchi,以避免出现[sS]https://github.com/plk/biber/issues/235

请注意,它不需要在字段\bibstring内使用,如果需要,它将在打印字段时pubstate自动添加。biblatex

相关内容