32

我的问题是关于在 bst 文件中定义 bibtex 样式字段的方式。我想让下面的示例逐个解释,以了解每个部分在做什么。我希望自己能够对该示例进行更改。

功能 {format.eprint}
{电子打印重复$空$
    '跳过$
    { "\电子版"
      存档空$
        '跳过$
        { “[“ * 档案 * ”]” * }
      如果$
      "{" * 交换$ * "}" *
    }
  如果$
}
4

1 回答 1

45

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

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

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

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

接下来你有一个if$语句,它在后缀中,if$. 由于语言是后缀,if$如果堆栈上的顶部项目是,则将选择 true 分支,否则将选择1false 分支。这也会从堆栈中删除顶部项目。(如果你想要真正的细节,这两个分支实际上是放在堆栈上的,然后if$语句会删除适当的一个,并让其余的材料留待执行。)

第一个(真正的)分支读取'skip$,这是一个“什么都不做”指令。如果包含前导,则可能会错过单个指令周围的大括号'。对于新用户来说(稍微)更容易阅读的替代方法是

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

简单地为“什么都不做”(真)分支使用一组空的大括号。因此,这里的目标是如果该eprint字段为空,则不执行任何操作。

错误分支开始"\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>}
于 2010-08-24T18:57:09.030 回答