BibTeX言語は少し複雑です。完全なリファレンスについては、TametheBeaSTを参照してください。覚えておくべき重要なことは、それがスタック言語であり、接尾辞アプローチを使用していることです。ほとんどすべての組み込み関数も、スタックから入力を削除します。
少しずつ取り上げると、最初の行はで始まります。これは、ファイルの他の場所で使用できるFUNCTION
新しい関数()を定義することを意味します。重要なことに、この新しい関数はここでのみ使用できます。ファイル内の関数の順序は重要です。中括弧は、さまざまな引数を示すために使用されます。関数の名前とそれを実装するコードの2つが必要です。format.eprint
.bst
.bst
FUNCTION
コード自体でeprint
は、フィールドになります。フィールドの名前を使用すると、フィールドの値がスタックに追加されます(現在のレコードの場合)。次にduplicate$
、スタックの一番上のアイテムを複製するがあります。これはBibTeX組み込み命令であり、ターミナルによって表示されます$
。したがって、スタックには、の値の2つのコピーが含まれますeprint
。
次の命令はempty$
です。これは、スタックの一番上のアイテムが空であるかどうかをテストし、それを削除するため、が必要ですduplicate$
。テストの結果は、またはのいずれ1
か0
であり、スタックに残されます。したがって、スタックの一番上の項目は1または0になり、次の項目はの値になりeprint
ます。
次に、接尾辞にあるステートメントがあり、の前if$
に2つのブランチがあります。言語は後置であるため、スタックの最上位の項目がそうである場合は、がtrueブランチを選択し、そうでない場合はfalseブランチを選択します。これにより、スタックから最上位のアイテムも削除されます。(実際の詳細が必要な場合は、2つのブランチが実際にスタックに配置され、ステートメントによって適切なブランチが削除され、残りのマテリアルが実行されます。)if$
if$
1
if$
'skip$
最初の(真の)ブランチは、「何もしない」命令であるを読み取ります。先頭のを含めると、単一の命令を囲む中括弧を見逃す可能性があります'
。新規ユーザーにとって(わずかに)読みやすい代替案は次のようになります。
FUNCTION {format.eprint}
{ eprint duplicate$ empty$
{ }
{ "\eprint"
archive empty$
{ }
{ "[" * archive * "]" * }
if$
"{" * swap$ * "}" *
}
if$
}
つまり、「何もしない」(true)ブランチに空の中括弧のセットを使用するだけです。eprint
したがって、ここでの目的は、フィールドが空の場合は何もしないことです。
偽の分岐が開始"\eprint"
され、文字列\eprint
がスタックの一番上に配置されます。次の部分では、archive
フィールドをスタックに配置し、空のフィールドに対して別のテストを実行します。archive
フィールドが使用可能な場合、コード
"[" * archive * "]" *
スタックに配置[
し、スタックの一番上のアイテム(以前は\eprint
)に結合します。この結合操作が実行さ*
れます。次に、フィールドの値がarchive
スタックに追加されて結合され、その後に別の値が続き]
ます。したがって、スタックの一番上には次のものが含まれます
\eprint[<archive>]
(<archive>
アーカイブフィールドの値はどこにありますか)に何かが指定されている場合archive
、\eprint
それ以外の場合。
最後に、やるべきことがいくつかあります。我々は持っています
"{" * swap$ * "}" *
これは最初{
にスタックに配置されます。これを一番上の項目(\eprint
または\eprint[<archive>]
)に結合して、を与え\eprint{
ます。このswap$
関数はスタックの上位2つの項目を交換するため、上位の項目はname <eprint>
(eprint
フィールドの値)です。作るジョイントがあります
\eprint{<eprint>
最後に最後に追加}
します。
その結果、スタックは一番上に1つのアイテムを獲得します。空の場合eprint
はスタックの一番上に空のアイテムがあり、そうでない場合は次のようになります。
\eprint{<eprint>}