![原始答案](https://linux22.com/image/389910/%E5%8E%9F%E5%A7%8B%E7%AD%94%E6%A1%88.png)
继续https://tex.stackexchange.com/a/441877/165772使用@moewe 的文件 babalpha-fl-gs 来自https://gist.github.com/moewew/158481168f4a2135764f96fc608a1998,考虑以下代码:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[USenglish,french,main=ngerman]{babel}
\usepackage{csquotes}
\usepackage{babelbib}
\usepackage{hyperref}
\bibliographystyle{babalpha-fl-gs}%%% As @moewe pointed out, the same issue exists with babalpha-fl. But if you have to modify it, I'd appreciate it if you modify babalpha-fl-gs instead.
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@string{acmp = {ACM Press}}
@string{aw = {Addison-Wesley}}
@string{ol = {Oldenbourg Wissenschaftsverlag}}
@string{pren = {Prentice Hall}}
@book{Bertrand-CalculDesProbabilites,
title = {Calcul des probabilit{\'e}s},
author = {Joseph Bertrand},
year = 1889,
publisher = {Gauthier-Villars},
language = {french}}
@book{Bergstra_89,
Author = {Jan Aldert Bergstra},
Isbn = {0-201-41635-2},
Language = {USenglish},
Note = {Editors: J. Heering and P. Klint},
Publisher = acmp # { and } # aw,
Series = {ACM Press Frontier Series},
Title = {Algebraic specification},
Year = {1989}}
@book{Eckel_99,
Author = {Bruce Eckel},
Language = {USenglish},
Publisher = pren,
Title = {Thinking in {C++}},
Year = 1999}
@book{Eckel_02,
Author = {Bruce Eckel},
Language = {USenglish},
Publisher = pren,
Title = {Thinking in {Java}},
Year = {2002}}
@misc{BroyEtAl-ModellierungVerteilterSysteme,
Author = {Manfred Broy},
Language = {ngerman},
Note = {Vorlesungsskript},
Title = {{Modellierung} {verteilter} {Systeme}},
Year = 2014}
@book{Brooks_87,
Author = {Rodney Allen Brooks},
Language = {ngerman},
Publisher = ol,
Title = {{LISP}: Programmieren in Common {L}isp},
Year = 1987}
\end{filecontents}
\begin{document}
\cite{Bertrand-CalculDesProbabilites,Bergstra_89,Eckel_99,Eckel_02,Brooks_87,BroyEtAl-ModellierungVerteilterSysteme}
\bibliography{\jobname}
\end{document}
在标准 pdflatex-bibtex-loop 的输出中,两个条目获得相同的缩写:
如何消除 Ber89 条目的歧义,同时保留其他条目的顺序?(如果可能的话,我真的不想从 babalpha-fl 更改为其他样式或从 bibtex 更改为 biber,因为这会在非最小示例中引发一系列其他兼容性问题,其中包含大量其他软件包,而且很可能还会导致出版商必须同意格式的更改。)
答案1
原始答案
这是一个相当有趣的极端情况。
alpha
基于的文件.bst
实际上使用略有不同的标签进行排序和引用。排序标签sort.label
由字母组合和四位数年份组成,而引用标签label
由字母组合和年份的最后两位数字组成。
因此,MWE 中的两个条目都有标签Ber89
,但Bertrand-CalculDesProbabilites
有sort.label
ber1889
和Bergstra_89
有sort.label
ber1989
。
有趣的是,extra.label
避免名称冲突的信息是根据 计算的sort.label
,尽管文档中只有引用标签可见。由于 ssort.label
不同,因此不extra.label
添加。(注意:这是事实,但这不是全部。排序本身也起着作用。请参阅下面的详细解释。)
一个简单的解决方案是确保label
和sort.label
相同。可以通过将整个定义替换FUNCTION {calc.label}
为
FUNCTION {calc.label}
{ type$ "book" =
type$ "inbook" =
or
'author.editor.key.label
{ type$ "proceedings" =
'editor.key.organization.label
{ type$ "manual" =
'author.key.organization.label
'author.key.label
if$
}
if$
}
if$
year field.or.null purify$ #-1 #2 substring$
*
duplicate$
'label :=
sortify 'sort.label :=
}
扩展的 MWE
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[USenglish,french,main=ngerman]{babel}
\usepackage{csquotes}
\usepackage{babelbib}
\usepackage{hyperref}
\bibliographystyle{babalpha-fl-gs}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{Bertrand-CalculDesProbabilites,
title = {Calcul des probabilit{\'e}s},
author = {Joseph Bertrand},
year = 1889,
publisher = {Gauthier-Villars},
language = {french}
}
@book{Bergstra_89,
author = {Jan Aldert Bergstra},
isbn = {0-201-41635-2},
note = {Editors: J. Heering and P. Klint},
publisher = {ACM Press and Addison-Wesley},
series = {ACM Press Frontier Series},
title = {Algebraic specification},
year = {1989},
language = {USenglish},
}
@book{Bertrand-90,
title = {Calcul des probabilit{\'e}s II: Return of the Kolmogorov},
author = {Joseph Bertrand},
year = 1890,
publisher = {Gauthier-Villars},
language = {french}
}
\end{filecontents}
\begin{document}
\cite{Bertrand-CalculDesProbabilites,Bergstra_89,Bertrand-90}
\bibliography{\jobname}
\end{document}
然后会产生
关于编辑的问题。
按字母顺序对书目进行排序比较棘手。
这种直接的排序方法首先按照文档中显示的字母标签进行排序,然后通过添加其他信息(比如按名称、年份、标题的顺序)来打破平局,当涉及不同的世纪时,有些人可能会觉得这种输出令人反感
[Elk02] 安妮·埃尔克:关于野牛龙的理论。2002
[Elk99] 安妮·埃尔克:关于雷龙的理论。1999 年。
不喜欢这种输出的人认为时间顺序应该覆盖严格基于“标签”的排序。这就是为什么alpha
实际上使用标签的字母部分进行排序,并且四年份的数字,而不是输出中显示的两位数字。
想知道以下条目需要什么样的排序顺序
[Uth02]爱丽丝·乌索尔:一本书。2002 年。
[Uth03]艾玛·乌斯林森:B 书2003 年。
[Uth04] 爱丽丝·乌索尔:另一本书。2004 年。
[Uth05]艾玛·乌斯林森:Bn 書。2005 年。
如果您通常认为整个年份应该优先于标签,以使同一作者的作品按时间顺序排列,那么您可能更倾向于将同一作者的作品放在一起,并且必须接受在这些情况下作者姓名应该再次优先于标签。
最终,这可能会导致一种排序方案,该方案优先于实际的引用标签,优先考虑全名和年份。虽然这对那些非常熟悉书目中的参考文献(即书目作者)的人来说更有吸引力,因为同一作者的作品被放在一起并按时间顺序排列,但对于(尚未了解情况的)读者来说,导航可能会更加困难,因为他们只有字母标签可以参考。我可能无法争辩说,当排序或多或少与读者所拥有的唯一信息(即标签)脱钩时,读者确实有可能找不到正确的引用标签,但可以想象,她将不得不花费更多的时间在包含几部作者姓名缩写相似的著作的大型书目中找到正确的参考文献。
无论你选择哪种非严格基于标签的排序,你总是会面临这样的风险:两个具有相同基本形式的标签被不同的标签分隔开
[Ber89] 维多利亚·伯格曼:标题。1889 年。
[Ber90] 维多利亚·伯格曼:标题。1890年。
[Ber89] 索菲·伯格斯特拉:标题。1989 年。
alpha
基于alpha.bst
分配额外标签消歧义标签的方式和其他 BibTeX 样式在这种情况下很容易受到影响。它的工作原理如下。
BibTeX 迭代排序后的条目列表(其中已排序表示按照条目在参考书目中的显示方式排序。在每个条目处,它会检查基本排序标签(例如伯1889) 与前一个基本排序标签相同。如果是这种情况,计数器将递增并extra.label
添加一个字母。(然后 BibTeX 必须进行反向传递,以确保将“a”添加到具有相同基本标签的每个第一个条目中。——它无法在第一步中做到这一点,因为在处理具有特定标签的第一个项目时,尚不清楚它是否仍是具有该基本标签的唯一项目。)
请注意,这发生在一个非常简单的循环中,其中只记住了前一个标签。没有所有先前标签的列表。
因此,当将相同的基本标签传递给 BibTeX,而中间带有不同的标签时,此方法就会失效。贝尔89,贝尔90,贝尔89前一个标签和当前标签总是不同(即使我们只看标签而不看排序标签),因此不会生成额外的标签。
我们可以尝试通过将额外的标签迭代与参考书目实际排序分离来解决此问题。首先,我们按可见标签对项目进行排序,以生成一个列表,其中相同的标签彼此相连。基于该列表,我们生成extra.label
。然后我们使用排序标签对参考书目条目进行排序。
差异(与原始版本相比babalpha-fl-gs.bst
)https://tex.stackexchange.com/a/441877/35864和https://gist.github.com/moewew/158481168f4a2135764f96fc608a1998)所需的更改是
--- babalpha-fl-gs.bst 2019-02-02 13:38:29.856655800 +0100
+++ babalpha-fl-gs-sort.bst 2019-02-02 13:40:07.936905700 +0100
@@ -1,3 +1,11 @@
+%%%%%% `babalpha-fl-gs-sort.bst'
+%%%%%% babalpha-fl-gs with tweaked sorting
+%%%%%% for https://tex.stackexchange.com/q/472951/35864
+%%%%%% 2019-02-02 MW
+%%%%%% available at
+%%%%%% https://gist.github.com/moewew/6a59fc23db6d2ab219b6f189a3645a06
+%%%%%% header of `babalpha-fl-gs.bst' follows
+%%%%%%
%%%% `babalpha-fl-gs.bst'
%%%% a copy of `babalpha-fl.bst' that automatically tries to suppress
%%%% historically problematic abbreviations
@@ -59,7 +67,7 @@
year
}
{}
- { label extra.label sort.label }
+ { label extra.label sort.label real.sortkey }
INTEGERS
{ output.state
@@ -1498,7 +1506,9 @@
if$
}
-FUNCTION {presort}
+% label generation: extra label
+
+FUNCTION {calc.real.sortkey}
{
calc.label
sort.label
@@ -1529,10 +1539,22 @@
sort.format.title
*
#1 entry.max$ substring$
+ 'real.sortkey :=
+}
+
+FUNCTION {labelgenpresort}
+{
+ calc.real.sortkey
+ label
+ " "
+ *
+ real.sortkey
+ *
+ #1 entry.max$ substring$
'sort.key$ :=
}
-ITERATE {presort}
+ITERATE {labelgenpresort}
SORT
@@ -1549,13 +1571,13 @@
}
FUNCTION {forward.pass}
-{ last.sort.label sort.label =
+{ last.sort.label label =
{ last.extra.num #1 + 'last.extra.num :=
last.extra.num int.to.chr$ 'extra.label :=
}
{ "a" chr.to.int$ 'last.extra.num :=
"" 'extra.label :=
- sort.label 'last.sort.label :=
+ label 'last.sort.label :=
}
if$
}
@@ -1580,6 +1602,18 @@
ITERATE {forward.pass}
REVERSE {reverse.pass}
+% actual sorting
+
+FUNCTION {presort}
+{
+ real.sortkey
+ 'sort.key$ :=
+}
+
+ITERATE {presort}
+
+SORT
+
FUNCTION {begin.bib}
{
et.al.char.used
新文件babalpha-fl-gs-sort.bst
可以在以下位置找到:https://gist.github.com/moewew/6a59fc23db6d2ab219b6f189a3645a06
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[USenglish,french,main=ngerman]{babel}
\usepackage{csquotes}
\usepackage{babelbib}
\usepackage{hyperref}
\bibliographystyle{babalpha-fl-gs-sort}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@string{acmp = {ACM Press}}
@string{aw = {Addison-Wesley}}
@string{ol = {Oldenbourg Wissenschaftsverlag}}
@string{pren = {Prentice Hall}}
@book{Bertrand-CalculDesProbabilites,
title = {Calcul des probabilit{\'e}s},
author = {Joseph Bertrand},
year = 1889,
publisher = {Gauthier-Villars},
language = {french},
}
@book{Bergstra_89,
author = {Jan Aldert Bergstra},
isbn = {0-201-41635-2},
language = {USenglish},
note = {Editors: J. Heering and P. Klint},
publisher = acmp # { and } # aw,
series = {ACM Press Frontier Series},
title = {Algebraic specification},
year = {1989},
}
@book{Eckel_99,
author = {Bruce Eckel},
language = {USenglish},
publisher = pren,
title = {Thinking in {C++}},
year = 1999,
}
@book{Eckel_02,
author = {Bruce Eckel},
language = {USenglish},
publisher = pren,
title = {Thinking in {Java}},
year = {2002},
}
@misc{BroyEtAl-ModellierungVerteilterSysteme,
author = {Manfred Broy},
language = {ngerman},
note = {Vorlesungsskript},
title = {Modellierung verteilter Systeme},
year = 2014,
}
@book{Brooks_87,
author = {Rodney Allen Brooks},
language = {ngerman},
publisher = ol,
title = {{LISP}: Programmieren in Common {Lisp}},
year = 1987,
}
@book{Bertrand-90,
title = {Calcul des probabilit{\'e}s II: Return of the Kolmogorov},
author = {Joseph Bertrand},
year = 1890,
publisher = {Gauthier-Villars},
language = {french},
}
\end{filecontents}
\begin{document}
\nocite{*}
\cite{Bertrand-CalculDesProbabilites,Bergstra_89,Bertrand-90}
\bibliography{\jobname}
\end{document}
生产