我的问题是关于在bst文件中定义bibtex样式字段的方式。我想在下面逐一解释下面的例子,以了解每件作品的作用。我希望自己能够对这个例子做出改变。
FUNCTION {format.eprint} { eprint duplicate$ empty$ 'skip$ { "\eprint" archive empty$ 'skip$ { "[" * archive * "]" * } if$ "{" * swap$ * "}" * } if$ }
答案 0 :(得分:37)
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$
}
即只是为'do nothing'(true)分支使用一组空括号。因此,如果eprint
字段为空,则此处的目标是不执行任何操作。
false分支启动"\eprint"
,它将文字\eprint
放在堆栈的顶部。接下来的部分是将archive
字段放到堆栈上,然后对空字段进行另一次测试。如果archive
字段可用,则代码
"[" * archive * "]" *
会将[
放到堆栈上,然后将其连接到堆栈上的顶部项目(\eprint
):此加入操作是*
的操作。然后将archive
字段的值添加到堆栈并加入,然后是另一个]
。所以堆栈的顶部将包含
\eprint[<archive>]
(其中<archive>
是归档字段的值)如果为archive
提供了任何内容,否则仍为\eprint
。
最后,还有一些字符串构建要做。我们有
"{" * swap$ * "}" *
首先将{
放入堆栈。这会加到顶部项目(\eprint
或\eprint[<archive>]
)上,以提供\eprint{
。 swap$
函数交换堆栈中的前两项,因此顶部项是名称<eprint>
(eprint
字段的值)。有一个联合作出
\eprint{<eprint>
然后最后添加}
到最后。
结果是堆栈将在顶部获得一个项目。如果eprint
为空,则堆栈顶部会有一个空项,否则会读取
\eprint{<eprint>}