在我的参考书目中,我希望只保留第一个“名字”(当然,除了“姓氏”之外):没有其他名字,没有首字母。这出乎意料地难以实现。考虑一下这个 MWE:
\documentclass{scrreprt}
\usepackage[shorthands=off,american]{babel}
\usepackage{csquotes}
\begin{filecontents}{\jobname.bib}
@article{Becker.2012,
title = {Male gender bias in autism and pediatric autoimmunity},
author = {Becker, Kevin G and John Q. Public},
date = {2012},
journaltitle = {Autism research},
volume = {5},
number = {2},
pages = {77--83},
langid = {english},
}
@article{Bejerot.Eriksson.2014,
title = {Sexuality and gender role in autism spectrum disorder},
author = {Bejerot, Susanne Barbara Camelia and Eriksson, Jonna M},
date = {2014},
journaltitle = {PloS one},
volume = {9},
number = {1},
pages = {111--141},
langid = {english},
}
@book{Cardon.Matson.2016,
title = {Technology and the Treatment of Children with Autism Spectrum Disorder},
editor = {Cardon, Teresa and Matson, Johnny X.},
date = {2016},
publisher = {Springer},
location = {Heidelberg and New York and Dordrecht and London},
langid = {english},
}
\end{filecontents}
\usepackage[bibstyle=verbose, language=auto, autolang=other, dashed=true,
maxcitenames=2, sorting=nyt, alldates=year]{biblatex}
\addbibresource{\jobname.bib}
% FAMILYNAME in small caps:
\renewcommand*{\mkbibnamefamily}[1]{\textsc{#1}}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
我怎样才能摆脱这些“多余的”名字,除了将它们从我的 .bib 文件中删除之外,该文件经常从我无法控制的来源重新编译?
答案1
正如评论中提到的,biblatex
(BibTeX 确实如此)没有中间名的概念。除姓氏、“von”部分(前缀)、“junior”部分(后缀)之外的所有内容均被理解为名字。
如果我们使用扩展名称格式并添加新的名称部分,那么可以biblatex
区分第一个名字和中间名。但这需要稍微不自然的输入(参见Bibtex/Biber:如何使用埃塞俄比亚惯例引用作者?),尤其是不会改变文件中常规<prefix> <family>, <suffix>, <given>
或顺序中指定的名称的处理。此解决方案的优点是 Biber 了解不同的名称部分,并可以相应地进行排序、名称唯一性等。<given> <prefix> <family>
.bib
一个更简单的解决方案(缺点是 Biber 不知道它)是在解析名称之后在 LaTeX 端识别并删除中间名。如果您知道名称的特殊格式用途(名称部分用,分隔,而不仅仅是空格),l3regex
这会非常容易。biblatex
\bibnamedelima
\bibnamedelimb
\bibnamedelimi
\documentclass{scrreprt}
\usepackage[shorthands=off,american]{babel}
\usepackage{csquotes}
\usepackage[bibstyle=verbose, language=auto, autolang=other, dashed=true,
maxcitenames=2, sorting=nyt, alldates=year]{biblatex}
\renewcommand*{\mkbibnamefamily}{\textsc}
\renewcommand*{\mkbibnamegiven}{\getfirstgivenname}
\ExplSyntaxOn
\seq_new:N \l_ingmar_givennames_seq
\regex_const:Nn \c_ingmar_splitnames_regex { \c{bibnamedelim(a|b|i)}|\s+ }
\cs_new_protected_nopar:Npn \__ingmar_getfirstgiven:n #1
{
\regex_split:NnN \c_ingmar_splitnames_regex { #1 } \l_ingmar_givennames_seq
\seq_item:Nn \l_ingmar_givennames_seq {1}
}
\cs_generate_variant:Nn \__ingmar_getfirstgiven:n { o }
\NewDocumentCommand \getfirstgivenname {m}
{
\__ingmar_getfirstgiven:o {#1}
}
\ExplSyntaxOff
\begin{filecontents}{\jobname.bib}
@article{Becker.2012,
title = {Male gender bias in autism and pediatric autoimmunity},
author = {Becker, Kevin G. and John Q. Public},
date = {2012},
journaltitle = {Autism research},
volume = {5},
number = {2},
pages = {77--83},
langid = {english},
}
@article{Bejerot.Eriksson.2014,
title = {Sexuality and gender role in autism spectrum disorder},
author = {Bejerot, Susanne Barbara Camelia and Eriksson, Jonna M.},
date = {2014},
journaltitle = {PloS one},
volume = {9},
number = {1},
pages = {111--141},
langid = {english},
}
@book{Cardon.Matson.2016,
title = {Technology and the Treatment of Children with Autism Spectrum Disorder},
editor = {Cardon, Teresa and Matson, Johnny X.},
date = {2016},
publisher = {Springer},
location = {Heidelberg and New York and Dordrecht and London},
langid = {english},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
您可以看到问题出在
\documentclass{article}
\usepackage[shorthands=off,american]{babel}
\usepackage{csquotes}
\usepackage[style=authoryear]{biblatex}
\renewcommand*{\mkbibnamefamily}{\textsc}
\renewcommand*{\mkbibnamegiven}{\getfirstgivenname}
\ExplSyntaxOn
\seq_new:N \l_ingmar_givennames_seq
\regex_const:Nn \c_ingmar_splitnames_regex { \c{bibnamedelim(a|b|i)}|\s+ }
\cs_new_protected_nopar:Npn \__ingmar_getfirstgiven:n #1
{
\regex_split:NnN \c_ingmar_splitnames_regex { #1 } \l_ingmar_givennames_seq
\seq_item:Nn \l_ingmar_givennames_seq {1}
}
\cs_generate_variant:Nn \__ingmar_getfirstgiven:n { o }
\NewDocumentCommand \getfirstgivenname {m}
{
\__ingmar_getfirstgiven:o {#1}
}
\ExplSyntaxOff
\begin{filecontents}{\jobname.bib}
@book{doe:a,
title = {Book A},
author = {Jane Emilia Doe},
date = {2020},
}
@book{doe:b,
title = {Book B},
author = {Jane Edith Doe},
date = {2020},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\cite{doe:a,doe:b}
\printbibliography
\end{document}
两部不同的作品似乎具有相同的引用标签,并且doe:b
似乎在之前被错误地排序doe:a
。
这两种方法的融合是使用 Biber 源映射在读取数据时直接删除不需要的中间名首字母。不幸的是,这样的解决方案必须复制部分名称解析本身,因为它必须处理所有Jane Emilia Doe
、Doe, Jane Edith
、Georgina Anne de la Name Nother
前它们被分成其名称部分。
答案2
(这算是非答案,但对于评论来说太长了。)
您无法安全地从这样的全名自动生成可接受的名称形式。如果您的 bib 文件中有“John Ronald Reuel Tolkien”,那么程序错误地将他在参考书目中变成“John Tolkien”就太糟糕了。“Alan Milne”、“Thomas Eliot”等也是如此。
在您的书目文件中出现“Johan August Strindberg”并让程序将其输出为“Johan Strindberg”也是不对的。这是错误的。在这种情况下,您应该在书目中只写“Strindberg, August”,因为这是该作者的名字,在标题页和其他地方都使用过。书目不是完整的法定名称的地方,所以一开始就不要把它放在书目文件中。
如果作者在标题页等处使用了多个名字,例如 Philip José Farmer,您无权决定只使用“Philip Farmer”就足够了。首字母缩写也一样。名字可能以多种形式出现在印刷品中。例如,有些书的封面上 Robert A. Heinlein 的名字只是“Robert Heinlein”,但执行您想要的自动系统不会知道这一点,如果放任不管,就会创建不可接受的名字形式。