考虑两个 MWE (最小工作示例):
\RequirePackage{filecontents}
\begin{filecontents}{\jobname.bib}
@article{Delbaen1998,
year={1998},
title={Title3},
author={Delbaen, F.},
}
@article{Delbaen1994,
year={1994},
title={Title2},
author={Delbaen, Freddy},
}
@article{Delbaen1993,
year={1993},
title={Title1},
author={Delbaen, Freddy},
}
\end{filecontents}
\documentclass{article}
\usepackage[latin9]{inputenc}
\usepackage[style=authoryear
,uniquename=init
,firstinits=true
,backend=biber]{biblatex}
\bibliography{\jobname}
\begin{document}
\cite{Delbaen1993,Delbaen1994,Delbaen1998}
\printbibliography
\end{document}
和
\RequirePackage{filecontents}
\begin{filecontents}{\jobname.bib}
@article{Delbaen1998,
year={1998},
title={Title3},
author={Delbaen, Freddy}, % <----- THIS IS THE ONLY DIFFERENCE !
}
@article{Delbaen1994,
year={1994},
title={Title2},
author={Delbaen, Freddy},
}
@article{Delbaen1993,
year={1993},
title={Title1},
author={Delbaen, Freddy},
}
\end{filecontents}
\documentclass{article}
\usepackage[latin9]{inputenc}
\usepackage[style=authoryear
,uniquename=init
,firstinits=true
,backend=biber]{biblatex}
\bibliography{\jobname}
\begin{document}
\cite{Delbaen1993,Delbaen1994,Delbaen1998}
\printbibliography
\end{document}
该选项的效果uniquename=init
是,具有相同首字母的名字唯一地标识了一条引文。该选项firstinits=true
使参考书目仅显示首字母。
不知怎的,我觉得这两个名字(Freddy Delbaen 和 F. Delbaen)在参考文献中也应该被视为“相同”。这意味着,第一个 MWE 中的排序和破折号应该与第二个示例中的相同。
如何才能实现这一点,而无需手动编辑我的 bibtex 数据库?
(您认为这应该是预期的行为吗?)
答案1
作者经常以多种姓名发表作品(例如,博士论文通常以作者的法定全名发表),在这种情况下,我希望将单个作者的出版物在参考书目中一起排序,并在我的文内引用中分组。我也同意最好让该author
字段代表姓名的出版形式。
针对此类情况,我的解决方案如下:
使用条目
sortname
中的字段.bib
来建立在参考书目中对条目进行排序时要使用的名称格式。您的第一个条目将是:@article{Delbaen1998, year={1998}, title={Title3}, author={Delbaen, F.}, sortname={Delbaen, Freddy}, }
biblatex
将以下代码添加到您的序言中。这决定了创建字段时要查看的字段顺序labelname
。通过将其放在sortname
顶部,您在sortname
字段中输入的任何内容都将覆盖该author
字段,以便用于文内引用和参考书目破折号。(您可以根据需要重新排列其他字段的顺序;sortname
只需将其放在顶部即可。)\DeclareLabelname{% \field{sortname} \field{shortauthor} \field{author} \field{shorteditor} \field{editor} \field{translator} }
该解决方案允许您实施权限控制而无需从字段中删除信息,并且如果您确实想利用的消歧义功能,author
它还允许您使用全部选项。uniquename
biblatex
我应该指出,我通常使用一种样式,即作者姓名在参考书目中全写。我描述的方法适用于这些样式以及 MWE 中的首字母缩写样式。在全写样式中,字段author
将在参考书目中全写,但sortname
控制排序和文内引用中出现的内容。
编辑:根据@Christian Hupfer 的建议,这里有一个基于@user4514 的 MWE 的完整示例。
\RequirePackage{filecontents}
\begin{filecontents}{\jobname.bib}
@article{Delbaen1998,
year={1998},
title={Title3},
author={Delbaen, F.},
sortname={Delbaen, Freddy}, % This author is really Freddy Delbaen, not some other F. Delbaen.
}
@article{Delbaen1994,
year={1994},
title={Title2},
author={Delbaen, Freddy},
}
@article{Delbaen1993,
year={1993},
title={Title1},
author={Delbaen, Freddy},
}
\end{filecontents}
\documentclass{article}
\usepackage[latin9]{inputenc}
\usepackage[style=authoryear
,uniquename=init
,firstinits=true
,backend=biber]{biblatex}
\DeclareLabelname{%
\field{sortname} % sortname takes precedence over author for grouping/dashing
\field{shortauthor}
\field{author}
\field{shorteditor}
\field{editor}
\field{translator}
}
\bibliography{\jobname}
\begin{document}
\cite{Delbaen1993,Delbaen1994,Delbaen1998}
\printbibliography
\end{document}
输出:
biblatex
对于拼写样式,有以下选项:
\usepackage[style=authoryear-comp % compact citations (authors' names are not repeated if identical)
,dashed=false % no dash in bibliography
,uniquename=init % we can still disambiguate names in citations
,firstinits=false % full names are used in bibliography
,backend=biber]{biblatex}
您将获得以下输出:
编辑:上述答案适用于biblatex
2.9a 版本。如果您使用 3.0 或更高版本,则需要在步骤 2 的序言中使用以下代码,而不是上面给出的代码。这将创建一个namea
与 内容相同的字段sortname
,然后namea
用于文内引用,而不是sortname
。
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[fieldsource=sortname]
\step[fieldset=namea, origfieldval, final]
}
}
}
\DeclareLabelname{%
\field{namea}
\field{shortauthor}
\field{author}
\field{shorteditor}
\field{editor}
\field{translator}
}
答案2
我认为这种行为有充分的理由。想象一下,你引用了 Frank Delbaen、Freddy Delbaen 和 Frannie Delbaen 的作品。最好将他们分开排序,但biber
目前还不清楚第四个“F. Delbaen”到底是谁(是这三个人中的一个,还是其他人?)。如果参考书目足够长,并且只使用首字母,那么某种程度的歧义可能是不可避免的,无论是在输出端还是在(计算机生成的)输入端……
如果你不想“修复”你的书目数据库,你可以使用\DeclareSourceMap
它来为你进行替换。例如:
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map[overwrite=true]{
\step[fieldsource=author,
match=\regexp{Delbaen,\s+F\.},
replace=\regexp{Delbaen,\x20Freddy}]
}
}
}
应该可以解决问题。它会搜索“Delbaen,<+1 或更多空格>F。”并将其替换为“Delbaen, Freddy”(恰好有一个空格)。