32

私の質問は、bst ファイルで bibtex スタイルのフィールドを定義する方法に関するものです。各部分が何をしているのかを理解するために、以下の例を部分的に説明したいと思います。私はその例を自分で変更できる立場になりたいと思っています。

FUNCTION {format.eprint}
{ eprint duplicate$ empty$
    'スキップ$
    { "\eprint"
      空のアーカイブ $
        'スキップ$
        { "[" * 記録 * "]" * }
      もし$
      "{" * swap$ * "}" *
    }
  もし$
}
4

1 に答える 1

45

BibTeX言語は少し複雑です。完全なリファレンスについては、TametheBeaSTを参照してください。覚えておくべき重要なことは、それがスタック言語であり、接尾辞アプローチを使用していることです。ほとんどすべての組み込み関数も、スタックから入力を削除します。

少しずつ取り上げると、最初の行はで始まります。これは、ファイルの他の場所で使用できるFUNCTION新しい関数()を定義することを意味します。重要なことに、この新しい関数はここでのみ使用できます。ファイル内の関数の順序は重要です。中括弧は、さまざまな引数を示すために使用されます。関数の名前とそれを実装するコードの2つが必要です。format.eprint.bst.bstFUNCTION

コード自体でeprintは、フィールドになります。フィールドの名前を使用すると、フィールドの値がスタックに追加されます(現在のレコードの場合)。次にduplicate$、スタックの一番上のアイテムを複製するがあります。これはBibTeX組み込み命令であり、ターミナルによって表示されます$。したがって、スタックには、の値の2つのコピーが含まれますeprint

次の命令はempty$です。これは、スタックの一番上のアイテムが空であるかどうかをテストし、それを削除するため、が必要ですduplicate$。テストの結果は、またはのいずれ10であり、スタックに残されます。したがって、スタックの一番上の項目は1または0になり、次の項目はの値になりeprintます。

次に、接尾辞にあるステートメントがあり、のif$に2つのブランチがあります。言語は後置であるため、スタックの最上位の項目がそうである場合は、がtrueブランチを選択し、そうでない場合はfalseブランチを選択します。これにより、スタックから最上位のアイテムも削除されます。(実際の詳細が必要な場合は、2つのブランチが実際にスタックに配置され、ステートメントによって適切なブランチが削除され、残りのマテリアルが実行されます。)if$if$1if$

'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>}
于 2010-08-24T18:57:09.030 に答える