Как работает контроль библиографии ReVTeX?

Как работает контроль библиографии ReVTeX?

В 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.firsttrue и другие настройки false. Таким образом, чтобы определить «правильное» значение, решите, какие настройки вы хотите активировать, посмотрите на код, чтобы найти соответствующее значение, и сложите их все вместе.

Связанный контент