更新2
我现在终于明白,这种行为确实是一个需要根据需要进行修改的功能。非常感谢@moewe 在这方面对我的教育。我现在已将他的/她的答案设置为接受的答案,因为它比之前的答案更完整。总之,Biber 允许您微调排序行为。请查看此问题的已接受答案以获取更多详细信息和指示。
更新 1
根据 Biber 文档第 22 页,我可以在一定程度上证实 Benedikt 和 Werner 的解释。连字符前的字符似乎被视为前缀。但这里更有趣的是 - 这仅在以下情况下发生:连字符前恰好两个字符。我通过尝试 1 个字符(A-Masri
, D-Masri
)、2 个字符(Al-Masri
, Ax-Masri
)和 3 个字符(Ala-Masri
)确认了这一点。对于 1 个字符和 3 个字符的试验,排序工作正常。在我看来,引擎代码没有真正实用的修复方法。因此,我(目前)向其他面临此问题的人建议依靠sortname
解决方法。
原始帖子
我观察到我的书目条目排序(按作者姓名)的行为不正确。我有一个条目,其主要作者的姓氏(排序键)包含连字符。这似乎导致引擎丢弃连字符之前的所有内容作为键的一部分。
以下是 MWE:
\documentclass{article}
\begin{filecontents}{references.bib}
@inproceedings{maleshkova2010investigating,
title={Investigating web apis on the world wide web},
author={Maleshkova, Maria and Pedrinaci, Carlos and Domingue, John},
booktitle={Web Services (ECOWS), 2010 IEEE 8th European Conference on},
pages={107--114},
year={2010},
organization={IEEE}
}
@inproceedings{al2007wsce,
title={WSCE: A crawler engine for large-scale discovery of web services},
author={Al-Masri, Eyhab and Mahmoud, Qusay H.}, % Notice the name here
booktitle={Web Services, 2007. ICWS 2007. IEEE International Conference on},
pages={1104--1111},
year={2007},
organization={IEEE}
}
\end{filecontents}
\usepackage[backend=biber,style=authoryear,sorting=nyt]{biblatex}
\addbibresource{references.bib}
\nocite{*}
% ========= %
\begin{document}
\printbibliography
\end{document}
这会导致以下(不正确的)输出:
我发现删除连字符可以Al-Masri
纠正排序。因此似乎用连字符引擎认为名称是Masri
,这是不正确的。
这是错误还是功能?如果是前者,该如何修复?如果是后者,我该如何解决?
答案1
正如您在编辑的问题中指出的那样,这不是一个错误,而是一个功能(但对我们来说幸运的是,它是一个可以控制和定制的功能)。
Biber 允许对异常进行排序以及在创建首字母时出现异常。这些异常可以分别用\DeclareNosort{}
和声明\DeclareNoinit{}
。
如果不存在命令,Biber 将默认
\DeclareNosort{
% strip prefixes like 'al-' when sorting names
\nosort{type_names}{\regexp{\A\p{L}{2}\p{Pd}}}
% strip diacritics when sorting names
\nosort{type_names}{\regexp{[\x{2bf}\x{2018}]}}
}
\DeclareNoinit{
% strip lowercase prefixes like 'al-' when generating initials from names
\noinit{\regexp{\b\p{Ll}{2}\p{Pd}}}
% strip diacritics when generating initials from names
\noinit{\regexp{[\x{2bf}\x{2018}]}}
}
正如注释中解释的那样,第一行将删除al-
/Al-
前缀(正则表达式匹配字符串开头的两个字母,后跟一个标点符号),因此我们可以删除这些行来获得
\DeclareNosort{
% strip diacritics when sorting names
\nosort{type_names}{\regexp{[\x{2bf}\x{2018}]}}
}
\DeclareNoinit{
% strip diacritics when generating initials from names
\noinit{\regexp{[\x{2bf}\x{2018}]}}
}
这将按预期对列表进行排序,因为“al-”/“Al-”前缀不再被忽略,此外它们也将被视为首字母,如果您不想要这样,只需将命令\DeclareNoinit{}
全部省略即可。
另请参阅 §4.5.6控制姓名首字母生成和第 4.5.7 节微调排序,第 164-166 页biblatex
文档。
如果你不想在写文档时将此行放在序言中,你可以考虑biblatex.cfg
使用 Biber 配置文件(有关更多信息,请参阅Biber 文档, §3.1选项和配置文件,第 9 页)
平均能量损失
\documentclass{article}
\begin{filecontents}{\jobname.bib}
@inproceedings{maleshkova2010investigating,
title={Investigating web apis on the world wide web},
author={Maleshkova, Maria and Pedrinaci, Carlos and Domingue, John},
booktitle={Web Services (ECOWS), 2010 IEEE 8th European Conference on},
pages={107--114},
year={2010},
organization={IEEE}
}
@inproceedings{al2007wsce,
title={WSCE: A crawler engine for large-scale discovery of web services},
author={Al-Masri, Eyhab and Mahmoud, Qusay H.}, % Notice the name here
booktitle={Web Services, 2007. ICWS 2007. IEEE International Conference on},
pages={1104--1111},
year={2007},
organization={IEEE}
}
\end{filecontents}
\usepackage[backend=biber,style=authoryear,sorting=nyt]{biblatex}
\addbibresource{\jobname.bib}
\nocite{*}
\DeclareNosort{
% strip diacritics when sorting names
\nosort{type_names}{\regexp{[\x{2bf}\x{2018}]}}
}
\DeclareNoinit{
% strip diacritics when generating initials from names
\noinit{\regexp{[\x{2bf}\x{2018}]}}
}
\begin{document}
\printbibliography
\end{document}
答案2
作为一种解释,我只能想象,biber
或者biblatex
将名称中的“al”部分视为某种名称前缀,类似于荷兰名称中的“de”。
我确信我还记得还有一个更全局的选项,但我现在没有时间去弄清楚。作为单一名称的简单解决方法,您可以为相应的项目提供一个sortname
字段。尝试以下条目:
@inproceedings{al2007wsce,
title={WSCE: A crawler engine for large-scale discovery of web services},
author={Al-Masri, Eyhab and Mahmoud, Qusay H.},
booktitle={Web Services, 2007. ICWS 2007. IEEE International Conference on},
pages={1104--1111},
year={2007},
organization={IEEE},
sortname = {Almasri}, % This field will be used for sorting
}