bib-style format for bibtext bst file- explained by an example

Ale*_*lex 27 latex bibtex

my question is regarding the way a bibtex-style field is defined in a bst file. I would like to have the following example below explained piece by piece, to understand what each piece is doing. I would like to be in a position to make changes to that example myself.

FUNCTION {format.eprint}
{ eprint duplicate$ empty$
    'skip$
    { "\eprint"
      archive empty$
        'skip$
        { "[" * archive * "]" * }
      if$
      "{" * swap$ * "}" *
    }
  if$
}

Jos*_*ght 38

BibTeX语言有点复杂:如需完整参考,请查看Tame the BeaST.要记住的关键事项是它是一种堆栈语言,它使用后缀方法.几乎所有内置函数也会从堆栈中删除它们的输入.

逐条拍摄,第一行开头FUNCTION,这意味着它将定义一个新的函数(format.eprint),可以在.bst文件的其他地方使用.重要的是,这个新功能只能在这里使用:.bst文件中的功能顺序很重要.大括号用于显示不同的参数:FUNCTION需要两个,函数的名称和实现它的代码.

在代码本身中,eprint将是一个字段.使用字段名称将字段的值添加到堆栈(对于当前记录).然后我们有duplicate$,它复制了堆栈上的顶级项目.这是一个BibTeX内置指令,由终端显示$.所以堆栈现在将包含两个值的副本eprint.

下一条指令是empty$.这将测试堆栈的顶部项是否为空并删除它,因此需要duplicate$.测试结果是1或者0,它留在堆栈上.所以堆栈的顶部项目现在是1或0,下一项是值eprint.

接下来你有一个if$说法,这是在后缀等具有两个分支if$.由于语言是后缀,所以if$会发生如果堆栈中的顶部项目是,则选择真正的分支,否则选择1假分支.这也从堆栈中删除了顶部项目.(如果你想要真正的细节,那么这两个分支实际上放在堆栈上,然后if$语句删除相应的一个并留下要执行的其余材料.)

第一个(真实)分支读取'skip$,这是一个"无所事事"指令.如果包含前导,则可能会错过单个指令的大括号'.对于新用户来说(稍微)更容易阅读的替代方案将是

FUNCTION {format.eprint}
{ eprint duplicate$ empty$
    { }
    { "\eprint"
      archive empty$
        { }
        { "[" * archive * "]" * }
      if$
      "{" * swap$ * "}" *
    }
  if$
}
Run Code Online (Sandbox Code Playgroud)

只是为'do nothing'(true)分支使用一组空括号.因此,如果该eprint领域是空的,那么这里的目标是什么都不做.

false分支开始"\eprint",将文字\eprint放在堆栈的顶部.接下来的部分是将archive字段放在堆栈上并对空字段进行另一次测试.如果该archive字段可用,则为代码

"[" * archive * "]" * 
Run Code Online (Sandbox Code Playgroud)

将放置[到堆栈然后将它连接到堆栈上的顶部项目(这是\eprint):这个连接操作是什么*.然后将该archive字段的值添加到堆栈并连接,然后是另一个].所以堆栈的顶部将包含

\eprint[<archive>]
Run Code Online (Sandbox Code Playgroud)

(<archive>存档字段的值在哪里)如果有任何给定的内容archive,仍然只是\eprint其他情况.

最后,还有更多的字符串构建要做.我们有

"{" * swap$ * "}" *
Run Code Online (Sandbox Code Playgroud)

它首先{放在堆栈上.这将连接到顶部项目(\eprint\eprint[<archive>])以给予\eprint{.该swap$函数交换堆栈中的前两项,因此顶部项是name <eprint>(eprint字段的值).有一个联合

\eprint{<eprint>
Run Code Online (Sandbox Code Playgroud)

然后最后添加}到最后.

结果是堆栈将在顶部获得一个项目.如果eprint为空,则堆栈顶部将有一个空项,否则将读取

    \eprint{<eprint>}
Run Code Online (Sandbox Code Playgroud)