Quais tokens o TeX não usa como argumentos indelimitados (a menos que entre { e } )?

Quais tokens o TeX não usa como argumentos indelimitados (a menos que entre { e } )?

Quais tokens o TeX não usa como argumentos indelimitados (a menos que estejam aninhados entre um token de caractere explícito do código de categoria 1 e um token de caractere explícito do código de categoria 2)?

No penúltimo parágrafo da curva perigosa antes do exercício 20.4 do TeXbook você encontra a frase:

Depois de dizer ' \def\row#1#2{...}', você poderá colocar espaços entre os argumentos (por exemplo, ' \row x n'), porque o TeX não usaespaços individuaiscomo argumentos ilimitados.

No parágrafo double dangeorus bend antes do exercício 20.5 do TeXbook você encontra a frase:

Como o TeX determina onde um argumento termina, você pergunta. Responder:[...]Um parâmetro não delimitado é seguido imediatamente no⟨texto do parâmetro⟩por um token de parâmetro ou ocorre no final do texto do parâmetro; neste caso o argumento correspondente é o próximotoken não vazio, a menos que esse token seja ' {', quando o argumento será todo o {...}grupo a seguir.

No TeXbook não encontrei definições precisas nem para o termo "espaço único" nem para o termo "token não vazio".

Por favor, enumere todos os tokens que o TeX não usa como argumentos indelimitados (a menos que estejam aninhados entre um token de caractere explícito do código de categoria 1 e um token de caractere explícito do código de categoria 2).

Até agora descobri que o TeX não usa tokens de caracteres explícitos do código de categoria 10 e do código de caracteres 32 como argumentos indelimitados - você precisa se concentrar no que o TeX considera para \macroo segundo argumento de:

\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\macro A B 
\show\macrob
\bye

Tokens de caracteres implícitos do código de categoria 10 e do código de caracteres 32 são usados ​​como argumentos de macro não delimitados:

\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\catcode`\X=13
\uppercase{\let\space= } %
\uppercase{\letX= } %
\macro A\space B 
\show\macrob
\macro AXB
\show\macrob
\bye

Espaços engraçados explícitos são usados ​​como argumentos macro indelimitados:

\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\uccode`\ =`\a
\uppercase{\macro A B}%
\show\macrob
\bye

Espaços engraçados implícitos são usados ​​como argumentos macro indelimitados:

\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\def\letcs#1#2{\let#1= #2}%
\catcode`\X=13
\uccode`\ =`\a
\uppercase{\letcs\space{ }}%
\uppercase{\letcsX{ }}%
\macro A\space B 
\show\macrob
\macro AXB
\show\macrob
\bye

Tokens de caracteres implícitos/explícitos do código de categoria 12 e do código de caracteres 32 são usados ​​como argumentos de macro não delimitados:

\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\catcode`\ =12\relax%
\let\space= %
\macro{A} {B}%
\show\macrob
\macro{A}\space{B}%
\show\macrob
\bye

O espaço de controle é usado como argumento de macro não delimitado:

\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\macro A\ B
\show\macrob
\bye

Portanto, testei alguns casos, mas testar casos extremos não leva a uma definição precisa para o termo "espaço único" nem a uma definição precisa para o termo "token não vazio". ;-)

Em outras palavras: não sei exatamente quais tokens o TeX não usa como argumentos indelimitados (a menos que estejam aninhados entre um token de caractere de código de categoria 1 e um token de caractere de código de categoria 2).

Parece que a quantidade⟨token espacial⟩não é igual a "espaço único"/"token não vazio":

O TeXbook diz no Capítulo 24: Resumo do Modo Vertical:

A quantidade⟨token espacial⟩, que foi usado na sintaxe de⟨espaços opcionais⟩acima, representa um espaço explícito ou implícito. Em outras palavras, denota um token de caractere da categoria 10, ou uma sequência de controle ou caractere ativo cujo significado atual foi igualado a tal token por \letou \futurelet.

A mencionada "sequência de controle ou caráter ativo", subsumida em⟨token espacial⟩, será usado como argumento de macro indelimitado - os exemplos acima mostram isso - enquanto "espaço único"/"token não vazio" não é usado como argumento de macro indelimitado.

Provavelmente "espaço único"/"token não vazio" é um subconjunto estrito de⟨token espacial⟩?

Se sim, qual subconjunto exatamente?

Responder1

O estilo do TeXbook costuma dizer algo que é correto, mas não a verdade completa.

Não existe uma definição formal de “espaço único”, porque não é necessário.

Na verdade, se você tentar

\begingroup\def\\{\global\let\spacetoken= }\\ \endgroup

\def\foo#1#2{(First is #1)(Second is #2)}

\foo AB

\foo A B

\edef\two{\space\space}
\expandafter\foo\expandafter A\two B

\foo A\spacetoken B

\bye

você obterá três instâncias de

(O primeiro é A) (o segundo é B)

e a última linha produzirá

(O primeiro é A) (o segundo é) B

O \expandaftertruque é usado para injetar vários espaços entre Ae B. Então você vê que o próximo exercício é “mais correto”: o TeX pula qualquerexplícitotoken de espaço ao procurar por um argumento indelimitado.

O último exemplo mostra queimplícitotokens de espaço não são ignorados. A primeira linha do código foi emprestada do exercício 24.6, para criar \spacetokenum token de espaço implícito, porque não se pode simplesmente fazer como em \let\bgroup={. Se você adicionar \show\spacetokenvocê obtém

> \spacetoken=blank space  .

Mas isso énãoignorado ao procurar por um argumento indelimitado.

Um token de espaço explícito é um token de caractere de código de categoria 10 (espaço ou tabulação, na configuração normal; mas veja mais detalhes posteriormente se estiver interessado neles). Na configuração normal, isso pode ser gerado por um espaço em branco ou uma tabulação na entrada, ou qualquer caractere ao qual seja atribuído o código de categoria 10 no momento em que a entrada é tokenizada.


Mas há um porém. Sempre há um!

É preciso levar em conta que o TeX absorverá caracteres com código de categoria 10, atribuindo-lhes o código de caractere 32 independentemente de seu código de caractere original. Assim, tabulações não são diferentes de espaços, porquesãoo mesmo depois que a tokenização for realizada.

Então, qual é o problema

\uccode` =`x \uppercase{\foo A B}

isso não ignora o espaço engraçado? Na verdade é diferente de

\catcode`*=10 \foo A*B

que ignora o asterisco, pois possui código de categoria 10.

O fato é que caracteres com código de categoria 10 sãonormalizadoter o código de caracteres 32durante a tokenização. Porém, quando \uppercaseaplicado, a tokenização já foi realizada e o espaço possui o código de caractere 32. Mas depois \uppercaseo caractere passa a ser x10 , o que não é mais válido por ser ignorado, pois não possui o código de caractere 32.

Portanto, a resposta de que apenas os caracteres com código de caractere 32 e código de categoria 10 são ignorados é correta, mas enganosa se a normalização não for levada em consideração.

Responder2

tex.web tem

begin if cur_tok=space_token then

para pular os tokens ignorados onde space_tokenestá

@d space_token=@'5040 {$2^8\cdot|spacer|+|" "|$}

Responder3

Sequências de tokens de caracteres explícitos de código de caracteres 32 e categoria 10 (espaço) são as únicas coisas que o TeX ignora enquanto "procura" o início de um argumento indelimitado.


A quantidade⟨token espacial⟩na verdade, não é igual a "espaço único"/"token não vazio" no sentido dos parágrafos do TeXbook citados por você:

A quantidade⟨um espaço opcional⟩é definido como:

⟨um espaço opcional⟩⟨token espacial⟩|⟨vazio⟩

Onde quer que⟨um espaço opcional⟩é permitido, que também pode ser um token de espaço implícito.

Veja, por exemplo,

\lowercase{\let\sptoken = } %
\edef\result{\number1234 }
\show\result
\edef\result{\number1234\sptoken}
\show\result
\let\result\sptoken\sptoken=\sptoken\TeX
\bye

(Aqui \lowercase não faz nada além de remover as chaves. Dessa forma, você obtém dois tokens de espaço explícitos do código de caractere 32 atrás de "=". O primeiro será descartado porque com \let-assignments um espaço é opcional atrás de "=". O segundo não será será descartado, mas será o token cujo significado é atribuído a \sptoken.)

\sptokené um token de espaço implícito.
Ele é descartado durante \numbera avaliação do TeX como um token de espaço explícito.
Também é descartado como qualquer outro⟨espaço opcional⟩enquanto executa a segunda \lettarefa.
Mas o TeX não pularia \sptokenenquanto “procurava” o início de uma discussão indefinida.

Portanto, este exemplo prova que a quantidade⟨token espacial⟩não é igual a "espaço único"/"token não vazio" no sentido dos parágrafos do TeXbook citados por você.


Por falar nisso:

Sua pergunta está focada em como o TeX trata os tokens enquanto procura o início de um argumento indeterminado.

Sua pergunta se refere a uma etapa do processamento onde a tokenização já foi feita.

Porém vale ressaltar um fato relacionado ao processo de tokenização do .tex-input:

Se, durante o processo de tokenização da entrada .tex, o TeX encontrar um caractere cujo código de categoria é 10 (espaço) enquanto o aparelho de leitura estiver no estado M (meio da linha), então o TeX anexará um token de caractere explícito da categoria 10 (espaço) e código de caractere 32 para o token-stream. Ou seja, o token resultante terá o código de caractere 32 independente do número que possui o ponto de código do caractere da entrada em questão.

Por exemplo, a guia horizontal – a guia horizontal tem o número de ponto de código 9 em ASCII – geralmente também tem o código de categoria 10 atribuído. Portanto, tokenizar uma guia horizontal geralmente produz um token de caractere explícito de categoria 10 (espaço) e código de caractere 32. Ou seja, aquele mesmo token que é ignorado pelo TeX enquanto "procura" pelo início de um argumento indelimitado.

informação relacionada