Почему у TeX так много кодов категорий?

Dec 21 2020

Когда я смотрю на длинный список кодов категорий, я просто не понимаю, зачем они все нужны. Например:

  • $, ^, _, И &может быть легко определено в качестве активных символов вместо.
  • Кстати &, зачем тратить такой общий символ на выравнивание табуляции? Почему бы не использовать что-то вроде \nc«новый столбец»?

Ответы

6 egreg Dec 21 2020 at 07:46

Конечно, не все символы со специальными кодами категорий можно заменить активными символами.

Коды категорий назначаются на этапе токенизации, а затем навсегда прикрепляются к токену символа. Однако символ с кодом категории 0 никогда не становится токеном символа, потому что он просто запускает механизм формирования управляющей последовательности. Точно так же невозможно иметь символьные токены с кодом категории 5 (конец строки), 9 (игнорируется), 14 (комментарий), 15 (недействительно).

Коды 0, 5, 9, 14 и 15 запускают особые действия. Историческое примечание: в TeX78 код категории %был 5 (что не допускало комментариев, как мы привыкли сейчас).

Различие между кодами категорий 11 и 12 существенно при формировании управляющих последовательностей: \aэто контрольное слово (и пробелы впоследствии игнорируются), а \?это контрольный символ (и пробелы не игнорируются).

Коды 1 и 2 также важны для макроопределений и захвата аргументов (и группирования). Код 10 является фундаментальным для нормализации пробелов и отступов кода. Код 14 соответствует комментариям и также важен, как и код 6, для обозначения параметров в определениях макросов (и в выравниваниях).

Теперь давайте рассмотрим коды 3, 4, 7, 8. Там может быть примитивы для них, скажем \mathshift, \alignment, \superscriptи \subscripts. Фактически их можно было бы определить по

\let\mathshift=$
\let\alignment=&
\let\superscript=^
\let\subscript=_

и действительно, простой TeX и LaTeX имеют \spи \sbопределены точно так же.

Почему бы не использовать активных персонажей? Что ж, активные персонажи были представлены в 1980 году, намного позже, чем начался бизнес с кодами категорий. У TeX78 было всего 13 кодов, поэтому следующий слот достался активным персонажам. Комментарии, как мы теперь знаем, получили слот 14 и добавлен код 15, чтобы справиться со странными символами, такими как ASCII 127 (который использовался с перфокартами для удаления предыдущего байта в случае ошибок, чтобы не тратить карту).

Но настоящая причина в том, что активные символы подобны макросам (точнее, управляющим последовательностям), и им можно присвоить новое значение в любое время.

Если вы говорите \def\b{foo}\def\a{\b}\def\b{baz}, то вызов \aпроизведет baz, а не foo.

Точно что-то вроде

\def\splat{\hbox{$\otimes$}}

с $активным персонажем не будет работать, если он будет работать \def${foo}позже. Нужно бы примитивным \mathshiftвместо $для этого определения , такие как \splat; но проблема будет просто выдвинута вперед: что, если кто-то почувствует настоятельную необходимость пересмотреть определение \mathshift?

Более того, #не может быть реализован как активный персонаж без изменения ядра TeX. Может быть, это можно сделать &, но примитив для начального значения будет необходим, и проблема останется той же, что и раньше.

Паранойя? Не за что. На сайте были вопросы от людей, которые использовали \foreach \number in {1,2,...,10} {...}и жаловались, что что-то пошло не так. Или \foreach \color in {<color list>}{...}и ад вырвался на свободу.