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)