我已多次看到该函数output.check
在 .bst 文件中被使用;我确信我曾经知道它做了什么,但现在我忘记了,而且我也无法轻易找到解释它的文档(它可能存在,但埋在一堆使用它但没有太多说明的资源中)。
在我的(merlin 生成的).bst 文件中,它显示
FUNCTION {output.check}
{ 't :=
duplicate$ empty$
{ pop$ "empty " t * " in " * cite$ * warning$ }
'output.nonnull
if$
}
但大部分内容我都不太清楚。这个函数有什么用?
答案1
简洁版本:
它检查必填字段是否为空,如果是,则发出警告。要知道哪个字段,您需要查看调用该函数的位置。例如,查看以下article
函数plain.bst
:
format.authors "author" output.check
这将检查作者字段并打印empty author in <entry>
到blg
文件。
长版本:
例如,在上面的例子中,该format.authors
函数是:
FUNCTION {format.authors}
{ author empty$
{ "" }
{ author format.names }
if$
}
它会将 或 留"<Author-names>"
在""
堆栈上,具体取决于是否author
给出了字段。所以,到目前为止,我们的堆栈有一个(可能是空的)字符串。现在我们"author"
在堆栈上插入一个字符串并调用output.check
。
output.check
将会执行't :=
,这会将堆栈最顶部的项目(文字字符串"author"
)放入变量中。现在我们在堆栈上't
只有(可能为空的)字符串。"<Author-names>"
然后我们有duplicate$
,它将复制它,然后我们有,如果作者姓名字符串为空,empty$
它将留下一个逻辑1
或。0
两个条件分支被插入到堆栈中,并在调用时使用if$
。if$
将检查是否empty$
返回1
或0
,并相应地将第一个或第二个分支放入堆栈。
如果1
分支被执行,则意味着author
未提供字段,然后我们将pop$ "empty " t * " in " * cite$ * warning$
丢弃(现在肯定是)空"<Author-names>"
字符串并发出警告。之后,执行将继续正常进行。
如果0
分支被采用,那么'output.nonnull
如果被调用来打印(现在肯定)不是空字符串。