
答案1
正如您原始帖子的上述評論中所提到的,MWE 對於其他人了解您想要實現的目標以及如何實現它是必要的。如果沒有這個,我無法確定我是否回答了您的問題,但我仍然會在這裡提供一些可能對您有用的信息。
您的螢幕截圖中的條目似乎屬於這種article
類型。如果這是真的,那麼natbib
withplainnat
將對這些文章進行如下排序。注意:我使用的是 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。按第一作者排序後 AND
b.除了“其他”之外還有更多作者可以去,並且
C。總共有兩個以上的作者 AND
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
檔案以解決無作者排序問題。