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
也会对该条目进行测试。russian
english
答案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
的条目, 将被中止。和都是这种情况。 因此这两个条目都不会设置其值(这意味着值会回落到)。langid
english
homer
tolstoy
presort
mm