![如何编辑 `plainnat.bst` 避免按键排序](https://linux22.com/image/357718/%E5%A6%82%E4%BD%95%E7%BC%96%E8%BE%91%20%60plainnat.bst%60%20%E9%81%BF%E5%85%8D%E6%8C%89%E9%94%AE%E6%8E%92%E5%BA%8F.png)
答案1
正如您在原帖的评论中提到的,MWE 是帮助其他人了解您想要实现的目标以及实现目标的方法所必需的。如果没有它,我无法确定我是否回答了您的问题,但我仍将在此提供一些可能对您有帮助的信息。
屏幕截图中的条目似乎属于 类型article
。如果这是真的,那么natbib
会plainnat
按以下方式对这些文章进行排序。注意:我使用的是 2007 版plainnat.bst
,这是截至 2022 年发布此帖时的最新版本。
该
presort
函数(从第 1313 行开始)应用该author.sort
规则(在第 1326 行)。该
author.sort
函数(从第 1248 行开始)首先测试author
字段是否为空。由于您的字段不为空,因此该函数将您的author
字段传递给该sort.format.names
函数。我在下面粘贴了该函数的副本
sort.format.names
(从第 1207 行开始)以协助解释。从上面的示例来看,您的条目分别有 6、4 或 7 位作者,将分号视为分隔符,将句点视为结束块author
。此处的代码看起来就像您在屏幕截图中显示的那样工作,按第一位作者排序,然后按年份对每个条目进行排序。您会注意到引用字段的函数开始发挥作用year
:a. 按第一作者排序后,并且
b. 除了“其他”作者外,还有更多作者可供参考,并且
c. 总共有两位以上的作者,并且
d. 该函数位于第二作者(第二次循环
while
)e.然后按年份排序。
请注意,BST 文件中的语言实现了后缀表示法。
FUNCTION {sort.format.names}
{ 's :=
#1 'nameptr :=
""
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{
s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't :=
nameptr #1 >
{
" " *
namesleft #1 = t "others" = and
{ "zzzzz" * }
{ numnames #2 > nameptr #2 = and
{ "zz" * year field.or.null * " " * }
'skip$
if$
t sortify *
}
if$
}
{ t sortify * }
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
尽管如此,TeX Stack Exchange 帖子中有一个答案这里描述如何定制plainnat.bst
文件以解决无作者排序问题。