在我正在为自己的文本改编的 ReVTeX bst 文件中,有以下部分代码:
FUNCTION {control.decode}
{
- duplicate$
#0 <
{
skip$ pop$ swap$ #0
}
{
swap$ pop$ swap$ #1
}
if$
swap$ :=
}
FUNCTION {control.author.decode}
{
control.author
duplicate$ duplicate$ #0 < swap$ #128 < not or
{
int.to.str$ "(" swap$ * ")" *
"Control cannot interpret author " swap$ *
warning$
}{
'control.author.jnrlst swap$ duplicate$ #64 control.decode
'control.author.dotless swap$ duplicate$ #32 control.decode
'control.author.nospace swap$ duplicate$ #16 control.decode
'control.author.initials swap$ duplicate$ #8 control.decode
'control.author.nocomma swap$ duplicate$ #4 control.decode
'control.author.first swap$ duplicate$ #2 control.decode
'control.author.reversed swap$ duplicate$ #1 control.decode
duplicate$ #0 =
'skip$
{
"Control: residue of author"
"(" swap$ * ")" * *
warning$
}
if$
pop$
}
if$
}
这段代码设置了我想要修改的作者显示选项,选项设置如下:
@CONTROL{REVTEX41Control}
@CONTROL{apsrev41Control,author="42",editor="1",pages="1",title="0",year="0"}
其中42
代表某些选项设置(我认为是因为选择随机值,如 3、7 和 00)会产生与这些选项相关的警告。有人能向我解释这些是如何“解码”的吗?我想弄清楚这些实际上对输出有什么影响。
答案1
这里的想法是control.author
可以将有关各种选项的信息全部编码成一个数字。这是使用数字的不同位传递一系列布尔设置的标准想法。要“恢复”数据,control.author.decode
首先进行范围内的测试control.author
(大于 0,小于 128)。这是通过
control.author
duplicate$ duplicate$ #0 < swap$ #128 < not or
在输入堆栈上留下了 的值control.author
和逻辑结果(a1
或 a 0
):后缀语言将后者作为 的一部分if$
。假设测试通过,则块
'control.author.jnrlst swap$ duplicate$ #64 control.decode
'control.author.dotless swap$ duplicate$ #32 control.decode
'control.author.nospace swap$ duplicate$ #16 control.decode
'control.author.initials swap$ duplicate$ #8 control.decode
'control.author.nocomma swap$ duplicate$ #4 control.decode
'control.author.first swap$ duplicate$ #2 control.decode
'control.author.reversed swap$ duplicate$ #1 control.decode
把姓名将每个设置放到堆栈上,然后按位提取所需的值,然后调用通用解码器。例如
'control.author.jnrlst swap$ duplicate$ #64 control.decode
输入42
将在堆栈上
"control.author.jnrlst" #42 #42 #64
在调用 之前control.decode
。后者将最终值(64
此处:'测试值')从控件的当前值(此处42
)中取出。如果输入大于'测试'值,则标志(此处control.author.jnrlst
)将设置为1
(真),并且结果残留物将留在输入中以供下一次测试。由于测试失败,输入值(42
)被保留,标志设置为0
(假)。通过这种方式将每个标志设置为真/假,并应使用所有输入(IE对于范围内的任何数字,测试结果都应为 0)。
在给出的例子中,authors
设置的值42
分解为 32 + 8 + 2,IE设置control.author.dotless
,control.author.initials
并且control.author.first
true 而其他设置 false。因此,要计算出“正确”的值,请确定要激活哪些设置,查看代码以找到适当的值并将它们全部加在一起。