我的问题是关于在 bst 文件中定义 bibtex 样式字段的方式。我想让下面的示例逐个解释,以了解每个部分在做什么。我希望自己能够对该示例进行更改。
功能 {format.eprint} {电子打印重复$空$ '跳过$ { "\电子版" 存档空$ '跳过$ { “[“ * 档案 * ”]” * } 如果$ "{" * 交换$ * "}" * } 如果$ }
BibTeX 语言有点复杂:完整的参考请看Tame the BeaST。要记住的关键是它是一种堆栈语言并且它使用后缀方法。几乎所有的内置函数也会从堆栈中删除它们的输入。
逐段来看,第一行以 开头FUNCTION
,这意味着它将定义一个新函数 ( format.eprint
),该函数可以在.bst
文件的其他地方使用。重要的是,这个新函数只能在下面使用:.bst
文件中函数的顺序很重要。大括号用于显示不同的参数:FUNCTION
需要两个,函数的名称和实现它的代码。
在代码本身中,eprint
将是一个字段。使用字段的名称将该字段的值添加到堆栈(对于当前记录)。然后我们有duplicate$
,它复制了堆栈上的顶部项目。这是一个 BibTeX 内置指令,由终端显示$
。所以堆栈现在将包含 的值的两个副本eprint
。
下一条指令是empty$
。这将测试堆栈的顶部项目是否为空并将其删除,因此需要duplicate$
. 测试的结果是1
或0
,它留在堆栈上。所以栈顶元素现在要么是 1 要么是 0,下一个元素是 的值eprint
。
接下来你有一个if$
语句,它在后缀中,在if$
. 由于语言是后缀,if$
如果堆栈上的顶部项目是,则将选择 true 分支,否则将选择1
false 分支。这也会从堆栈中删除顶部项目。(如果你想要真正的细节,这两个分支实际上是放在堆栈上的,然后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>}