
答え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. 著者は合計2名以上であり、
d. 関数は2番目の著者にあります(
while
ループの2回目)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
著者なしのソートに対応するためにファイルをカスタマイズする方法を説明します。