
В bst-файле ReVTeX, который я адаптирую для своего текста, есть такой фрагмент кода:
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
и логический результат (a 1
или 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
(ложь). Работая таким образом, мы установим каждый флаг в значение «истина/ложь» и должны использовать все входные данные (то естьдля любого числа, попадающего в диапазон, результатом тестов должно быть значение 0).
В приведенном примере значение для authors
настройки 42
распадается на 32 + 8 + 2,то естьнастройка control.author.dotless
, control.author.initials
и control.author.first
true и другие настройки false. Таким образом, чтобы определить «правильное» значение, решите, какие настройки вы хотите активировать, посмотрите на код, чтобы найти соответствующее значение, и сложите их все вместе.