ReVTeX の参考文献制御はどのように機能しますか?

ReVTeX の参考文献制御はどのように機能しますか?

私が自分のテキストに合わせて調整している ReVTeX bst ファイルには、次のコード部分があります。

FUNCTION {control.decode}
{
  - duplicate$
  #0 <
    {
      skip$ pop$ swap$ #0
    }
    {
      swap$ pop$ swap$ #1
    }
  if$
  swap$ :=
}
FUNCTION {control.author.decode}
{
  control.author
  duplicate$ duplicate$ #0 < swap$ #128 < not or
    {
      int.to.str$ "(" swap$ * ")" *
      "Control cannot interpret author " swap$ *
      warning$
    }{
      'control.author.jnrlst   swap$ duplicate$ #64 control.decode
      'control.author.dotless  swap$ duplicate$ #32 control.decode
      'control.author.nospace  swap$ duplicate$ #16 control.decode
      'control.author.initials swap$ duplicate$  #8 control.decode
      'control.author.nocomma  swap$ duplicate$  #4 control.decode
      'control.author.first    swap$ duplicate$  #2 control.decode
      'control.author.reversed swap$ duplicate$  #1 control.decode
      duplicate$ #0 =
        'skip$
        {
          "Control: residue of author"
          "(" swap$ * ")" * *
          warning$
        }
      if$
      pop$
    }
  if$
}

このコードは、変更したい著者表示オプションを設定します。オプションは次のように設定されます。

@CONTROL{REVTEX41Control}
@CONTROL{apsrev41Control,author="42",editor="1",pages="1",title="0",year="0"}

ここで、 は42何らかのオプション設定を表します (3、7、00 などのランダムな値を選択すると、これらのオプションに関連する警告が生成されます)。これらがどのように「デコード」されるのか説明できる人はいますか? これらが実際に出力にどのような影響を与えるかを理解したいと思います。

答え1

ここでのアイデアは、control.authorさまざまなオプションに関する情報をすべて1つの数値にエンコードして渡すことができるというものです。これは、数値のさまざまなビットを使用して一連のブール設定を渡すという標準的なアイデアです。データを「回復」するには、control.author.decodeまず範囲内(0より大きく、128より小さい)のテストを行いますcontrol.author。これは次のように行われます。

control.author
duplicate$ duplicate$ #0 < swap$ #128 < not or

入力スタックに の値control.authorと論理結果(a1または a 0)を残します。後置言語は の一部として後者を取得しますif$。テストが合格すると仮定すると、ブロック

'control.author.jnrlst   swap$ duplicate$ #64 control.decode
'control.author.dotless  swap$ duplicate$ #32 control.decode
'control.author.nospace  swap$ duplicate$ #16 control.decode
'control.author.initials swap$ duplicate$  #8 control.decode
'control.author.nocomma  swap$ duplicate$  #4 control.decode
'control.author.first    swap$ duplicate$  #2 control.decode
'control.author.reversed swap$ duplicate$  #1 control.decode

は、名前各設定をスタックに積み、その後にビット単位で抽出するために必要な値、そして共通デコーダーの呼び出しを行います。例えば

'control.author.jnrlst   swap$ duplicate$ #64 control.decode

入力は42スタック上に

"control.author.jnrlst" #42 #42 #64

を呼び出す直前に を呼び出しますcontrol.decode。後者は、64コントロールの現在の値 (ここでは ) から終了値 (ここでは「テスト値」)を減算します42。入力が「テスト」値よりも大きい場合、フラグ (ここではcontrol.author.jnrlst) は (true) に設定され1、結果の剰余が次のテストの入力に残されます。テストが失敗すると、入力値 ( 42) が保持され、フラグは0(false) に設定されます。これを処理することで、各フラグが true/false に設定され、入力 (つまり範囲内の数値の場合、テストの結果は 0 の値になります。

与えられた例では、設定の値authors4232 + 8 + 2に分解されます。つまり設定control.author.dotlessがtruecontrol.author.initialscontrol.author.first、他の設定が false です。したがって、「正しい」値を算出するには、アクティブにする設定を決定し、コードを確認して適切な値を見つけ、それらをすべて合計します。

関連情報