Dlaczego TeX ma tak wiele kodów kategorii?

Dec 21 2020

Kiedy patrzę na długą listę kodów kategorii, po prostu nie rozumiem, dlaczego wszystkie są potrzebne. Na przykład:

  • $, ^, _, I &mógł z łatwością została zdefiniowana jako aktywnych znaków zamiast.
  • A propos &, po co marnować taki powszechny symbol na wyrównanie zakładek? Dlaczego nie użyć czegoś takiego jak \nc„nowa kolumna”?

Odpowiedzi

6 egreg Dec 21 2020 at 07:46

Oczywiście nie wszystkie znaki ze specjalnymi kodami kategorii można zastąpić znakami aktywnymi.

Kody kategorii są przypisywane podczas fazy tokenizacji, a następnie są na stałe dołączane do tokena postaci. Jednak znak o kodzie kategorii 0 nigdy nie staje się tokenem znaku, ponieważ po prostu uruchamia mechanizm tworzenia sekwencji sterującej. Podobnie nie można mieć tokenów postaci z kodem kategorii 5 (koniec linii), 9 (ignorowane), 14 (komentarz), 15 (nieprawidłowy).

Kody 0, 5, 9, 14 i 15 wywołują akcje specjalne. Uwaga historyczna: w TeX78 kod kategorii %wynosił 5 (co nie pozwalało na komentarze, tak jak jesteśmy przyzwyczajeni).

Rozróżnienie między kodami kategorii 11 i 12 ma zasadnicze znaczenie podczas tworzenia sekwencji sterujących: \ajest słowem sterującym (i spacje są później ignorowane), natomiast \?jest symbolem kontrolnym (a spacje nie są ignorowane).

Kody 1 i 2 są również istotne dla definicji makr i chwytania argumentów (i grupowania). Kod 10 ma fundamentalne znaczenie dla normalizowania przestrzeni i wcięć kodu. Kod 14 odpowiada komentarzom i jest również ważny, podobnie jak kod 6, do oznaczania parametrów w definicjach makr (i dopasowaniach).

Załóżmy teraz bada kody 3, 4, 7, 8. Tam mógł być prymitywy dla nich powiedzieć \mathshift, \alignment, \superscripti \subscripts. Właściwie dałoby się je zdefiniować za pomocą

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

i rzeczywiście, zwykły TeX i LaTeX mają \spi \sbdefiniują dokładnie w ten sam sposób.

Dlaczego nie używać aktywnych postaci? Cóż, aktywne postacie zostały wprowadzone w 1980 roku, długo po rozpoczęciu biznesu z kodami kategorii. TeX78 miał tylko 13 kodów, więc aktywne znaki otrzymały następny slot. Komentarze, jakie znamy teraz, otrzymały gniazdo 14, a kod 15 został dodany, aby poradzić sobie z dziwnymi znakami, takimi jak ASCII 127 (który był używany z kartami perforowanymi do usuwania poprzedniego bajtu w przypadku błędów, aby nie zmarnować karty).

Ale prawdziwym powodem jest to, że aktywne znaki są jak makra (a dokładniej sekwencje sterujące) i w każdej chwili można im przypisać nowe znaczenie.

Jeśli powiesz \def\b{foo}\def\a{\b}\def\b{baz}, to wezwanie \abędzie produkować baz, a nie foo.

Podobnie coś w rodzaju

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

z $aktywną postacią nie zadziała, jeśli zrobi się to \def${foo}później. Należałoby prymitywne \mathshiftzamiast $za to definicję takich jak \splat; ale problem zostałby po prostu przesunięty do przodu: co by się stało, gdyby ktoś poczuł nieodpartą potrzebę przedefiniowania \mathshift?

Co więcej, #nie można zaimplementować jako aktywnej postaci bez zmiany rdzenia TeX-a. Może da się to zrobić &, ale pierwotne znaczenie byłoby konieczne, a problem byłby taki sam jak wcześniej.

Paranoja? Ani trochę. Na stronie pojawiły się pytania od osób, które korzystały \foreach \number in {1,2,...,10} {...}i narzekały, że coś poszło nie tak. Albo \foreach \color in {<color list>}{...}i piekło się rozpętało.