bibtex bst文件的bib样式格式 - 由一个例子解释

时间:2010-08-23 09:49:40

标签: latex bibtex

我的问题是关于在bst文件中定义bibtex样式字段的方式。我想在下面逐一解释下面的例子,以了解每件作品的作用。我希望自己能够对这个例子做出改变。

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

1 个答案:

答案 0 :(得分:37)

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

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

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

下一条指令是empty$。这将测试堆栈的顶部项目是否为空并删除它,因此需要duplicate$。测试结果是10,它留在堆栈中。所以堆栈的顶部项目现在是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>}