Por que o TeX tem tantos códigos de categoria?
Quando vejo a longa lista de códigos de categoria, simplesmente não entendo por que todos eles são necessários. Por exemplo:
$
,^
,_
, E&
poderia facilmente ter sido definida como personagens ativos em seu lugar.- Falando nisso
&
, por que desperdiçar um símbolo tão comum no alinhamento de guias? Por que não usar algo como\nc
“nova coluna”?
Respostas
Obviamente, nem todos os caracteres com códigos de categoria especiais podem ser substituídos por caracteres ativos.
Os códigos de categoria são atribuídos durante a fase de tokenização e, em seguida, são permanentemente anexados a um token de caractere. No entanto, um caractere com código de categoria 0 nunca se torna um token de caractere, pois apenas aciona o mecanismo para formar uma sequência de controle. Da mesma forma, é impossível ter tokens de caractere com código de categoria 5 (fim de linha), 9 (ignorado), 14 (comentário), 15 (inválido).
Todos os códigos 0, 5, 9, 14 e 15 ativam ações especiais. Nota histórica: no TeX78 o código da categoria %
era 5 (o que não permitia comentários como estamos acostumados agora).
A distinção entre os códigos de categoria 11 e 12 é essencial durante a formação de sequências de controle: \a
é uma palavra de controle (e os espaços são ignorados posteriormente), enquanto \?
é um símbolo de controle (e os espaços não são ignorados).
Os códigos 1 e 2 são igualmente essenciais para definições de macro e captura de argumentos (e agrupamento). O código 10 é fundamental para normalizar espaços e para indentação de código. O código 14 corresponde a comentários e é igualmente importante e o código 6 também, para denotar parâmetros em definições de macro (e em alinhamentos).
Vamos agora examinar os códigos de 3, 4, 7, 8. Não poderia ser primitivas para eles, dizem \mathshift
, \alignment
, \superscript
e \subscripts
. Na verdade, seria possível defini-los por
\let\mathshift=$
\let\alignment=&
\let\superscript=^
\let\subscript=_
e, de fato, o TeX e o LaTeX foram definidos \sp
e \sb
definidos exatamente da mesma maneira.
Por que não usar personagens ativos? Bem, personagens ativos foram introduzidos em 1980, bem depois que o negócio com códigos de categoria começou. TeX78 tinha apenas 13 códigos, então os personagens ativos conseguiram o próximo slot. Os comentários como os conhecemos agora têm o slot 14 e o código 15 foi adicionado para lidar com caracteres estranhos como ASCII 127 (que era usado com cartões perfurados para excluir o byte anterior em caso de erros para não desperdiçar um cartão).
Mas a verdadeira razão é que os caracteres ativos são como macros (mais precisamente, sequências de controle) e podem receber um novo significado a qualquer momento.
Se você disser \def\b{foo}\def\a{\b}\def\b{baz}
, então uma chamada de \a
produzirá baz
, não foo
.
Da mesma forma, algo como
\def\splat{\hbox{$\otimes$}}
com $
um personagem ativo não funcionaria caso alguém o fizesse \def${foo}
depois. Seria necessário um primitivo \mathshift
no lugar de $
para fazer uma definição como \splat
; mas o problema seria apenas empurrado para a frente: e se alguém sentir a necessidade imperiosa de redefinir \mathshift
?
Além disso, #
não pode ser implementado como um personagem ativo sem alterar o núcleo do TeX. Talvez isso possa ser feito &
, mas um primitivo para o significado inicial seria necessário e o problema seria o mesmo de antes.
Paranóia? De modo nenhum. Houve perguntas no site por pessoas que usaram \foreach \number in {1,2,...,10} {...}
e reclamaram que algo deu errado. Ou \foreach \color in {<color list>}{...}
e o inferno começou.