biblatex 的 DeclareSourcemap 的“final”选项有什么作用?

biblatex 的 DeclareSourcemap 的“final”选项有什么作用?

BibTeX 文档

以下 BibTeX 代码保存在 中~/TestBib.bib

@book{shakespeare,
   author = {William Shakespeare},
   title = {Hamlet},
   year = {1600},
   langid = {english}
}
@book{homer,
   author = {Homer},
   title = {Illiad \& Oddysey},
   year = {8th century BC},
   langid = {greek}
}
@book{tolstoy,
   author = {Leo Tolstoy},
   title = {War and Peace},
   year = {1869},
   langid = {russian}
}

带有参考书目的简单 LaTeX 文档

以下 LaTeX 代码保存在 中~/Test.tex

\documentclass{article}
\usepackage{biblatex}
\addbibresource{TestBib.bib}
\begin{document}
\cite{shakespeare}\cite{homer}\cite{tolstoy}
\printbibliography
\end{document}

运行结果

> cd ~
> lualatex 测试
> biber 测试
> lualatex 测试

未受篡改


英语第一,俄语第二

我们现在要添加一个源映射,对书目条目进行排序,以便英文条目在第一个,俄文条目在第二个。

\documentclass{article}
\usepackage{biblatex}
\DeclareSourcemap {
   \maps {
      \map {
         \step [
            fieldsource=langid,
            match=english,
            fieldset=presort,
            fieldvalue=a
         ]
         \step [
            fieldsource=langid,
            match=russian,
            fieldset=presort,
            fieldvalue=b
         ]
      }
   }
}
\addbibresource{TestBib.bib}
\begin{document}
\cite{shakespeare}\cite{homer}\cite{tolstoy}
\printbibliography
\end{document}

输出符合预期:

英语第一,俄语第二

添加final第一步

如果我们现在将选项添加final到第一个step,如下所示:

         \step [
            fieldsource=langid,
            match=english,
            fieldset=presort,
            fieldvalue=a,
            final
         ]

输出为:

使用“最终”选项

请注意,俄罗斯的参赛作品不再是第二名。


问题

为什么添加该final选项会改变书目条目的顺序?

我期望这个选项能够提高处理的效率:一旦第一个step匹配英文条目,该final选项就会导致第二个step被跳过,而如果没有这个final选项,第二个即使已经匹配,step也会对该条目进行测试。russianenglish

答案1

如果当前步骤的“先决条件”不满足,则该关键字将在使用它的位置之后final停止当前处理。\map\step

final终止条件
typeseource=<type>, 当前条目不是类型<type>
fieldsource=<field>, 字段<field>不存在
notfield=<field>, 场地<field> 展示
fieldsource=<field>, match=<regexp>, 字段<field>与正则表达式不匹配<regexp>
fieldset=<field>, <field>已经存在overwrite并且false

final

  \step[
    fieldsource=langid,
    match=english,
    fieldset=presort,
    fieldvalue=a,
    final
  ]

触发fieldsource=<field>, match=<regexp>,此处的情况,这意味着对于字段与不匹配\map的条目, 将被中止。和都是这种情况。 因此这两个条目都不会设置其值(这意味着值会回落到)。langidenglishhomertolstoypresortmm

相关内容