%3F.png)
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 \macro
o 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
\let
ou\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 \expandafter
truque é usado para injetar vários espaços entre A
e 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 \spacetoken
um token de espaço implícito, porque não se pode simplesmente fazer como em \let\bgroup={
. Se você adicionar \show\spacetoken
você 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 \uppercase
aplicado, a tokenização já foi realizada e o espaço possui o código de caractere 32. Mas depois \uppercase
o caractere passa a ser x
10 , 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_token
está
@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 \number
a 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 \let
tarefa.
Mas o TeX não pularia \sptoken
enquanto “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.