%3F.png)
¿Qué tokens no utiliza TeX como argumentos no delimitados (a menos que estén anidados entre un token de carácter explícito del código de categoría 1 y un token de carácter explícito del código de categoría 2)?
En el penúltimo párrafo de curva peligrosa antes del ejercicio 20.4 del TeXbook se encuentra la frase:
Después de haber dicho "
\def\row#1#2{...}
", se le permite poner espacios entre los argumentos (por ejemplo, "\row x n
"), porque TeX no usaespacios individualescomo argumentos no delimitados.
En el párrafo de doble curva peligrosa antes del ejercicio 20.5 del TeXbook se encuentra la frase:
¿Cómo determina TeX dónde termina un argumento? Respuesta:[...]Un parámetro no delimitado va seguido inmediatamente en el⟨texto de parámetro⟩por un token de parámetro, o aparece al final del texto del parámetro; en este caso el argumento correspondiente es el siguientetoken no en blanco, a menos que ese token sea '
{
', cuando el argumento será todo el{...}
grupo que sigue.
En el TeXbook no encontré definiciones precisas ni para el término "espacio único" ni para el término "token no en blanco".
Enumere todos los tokens que TeX no utiliza como argumentos no delimitados (a menos que estén anidados entre un token de carácter explícito del código de categoría 1 y un token de carácter explícito del código de categoría 2).
A estas alturas descubrí que TeX no usa tokens de caracteres explícitos del código de categoría 10 y el código de caracteres 32 como argumentos no delimitados; debes concentrarte en lo que TeX toma como \macro
segundo argumento de :
\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\macro A B
\show\macrob
\bye
Los tokens de caracteres implícitos del código de categoría 10 y el código de carácter 32 se utilizan como argumentos de macro no 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
Los espacios divertidos explícitos se utilizan como argumentos macro no delimitados:
\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\uccode`\ =`\a
\uppercase{\macro A B}%
\show\macrob
\bye
Los espacios graciosos implícitos se utilizan como argumentos macro no delimitados:
\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
Los tokens de caracteres implícitos/explícitos del código de categoría 12 y el código de carácter 32 se utilizan como argumentos de macro no 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
El espacio de control se utiliza como argumento de macro no delimitado:
\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\macro A\ B
\show\macrob
\bye
Así que probé algunos casos, pero probar casos extremos no conduce a una definición precisa del término "espacio único" ni a una definición precisa del término "token no en blanco". ;-)
En otras palabras: no sé con precisión qué tokens TeX no usa como argumentos no delimitados (a menos que estén anidados entre un token de carácter del código de categoría 1 y un token de carácter del código de categoría 2).
Parece la cantidad⟨ficha espacial⟩no es igual a "espacio único"/"token no en blanco":
El TeXbook dice en el Capítulo 24: Resumen del modo vertical:
La cantidad⟨ficha espacial⟩, que se utilizó en la sintaxis de⟨espacios opcionales⟩arriba, representa un espacio explícito o implícito. En otras palabras, denota un token de carácter de categoría 10, o una secuencia de control o carácter activo cuyo significado actual se ha igualado a dicho token mediante
\let
o\futurelet
.
La mencionada "secuencia de control o carácter activo", subsumible en⟨ficha espacial⟩, se utilizará como argumento de macro no delimitado (los ejemplos anteriores lo muestran), mientras que "espacio único"/"token no en blanco" no se utilizará como argumento de macro no delimitado.
Probablemente "espacio único"/"token no en blanco" sea un subconjunto estricto de⟨ficha espacial⟩?
Si es así, ¿qué subconjunto exactamente?
Respuesta1
El estilo del TeXbook es a menudo decir algo correcto, pero no toda la verdad.
No existe una definición formal de “espacio único”, porque no es necesario.
De hecho, si lo intentas
\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
obtendrás tres instancias de
(El primero es A)(El segundo es B)
y la última línea en su lugar producirá
(El primero es A)(El segundo es )B
El \expandafter
truco se utiliza para inyectar múltiples espacios entre A
y B
. Entonces ves que el siguiente ejercicio es “más correcto”: TeX se salta cualquierexplícitotoken de espacio cuando se busca un argumento no delimitado.
El último ejemplo muestra queimplícitoLas fichas de espacio no se omiten. La primera línea del código está tomada del ejercicio 24.6, para crear \spacetoken
un token de espacio implícito, porque no se puede simplemente hacer me gusta en \let\bgroup={
. Si agregas \show\spacetoken
obtienes
> \spacetoken=blank space .
pero esto esnoignorado cuando se busca un argumento no delimitado.
Un token de espacio explícito es un token de carácter del código de categoría 10 (espacio o tabulador, en configuración normal; pero consulte más adelante para obtener más detalles si está interesado en ellos). En la configuración normal, esto podría generarse mediante un espacio en blanco o una tabulación en la entrada, o cualquier carácter al que se le asigne el código de categoría 10 en el momento en que se tokeniza la entrada.
Pero hay un problema. ¡Siempre hay uno!
Hay que tener en cuenta que TeX absorberá caracteres con el código de categoría 10 y les asignará el código de carácter 32 independientemente de su código de carácter original. Así, las tabulaciones no se diferencian de los espacios, porquesonlo mismo una vez realizada la tokenización.
Entonces, ¿cuál es el problema con
\uccode` =`x \uppercase{\foo A B}
¿Eso no ignora el espacio divertido? De hecho, es diferente de
\catcode`*=10 \foo A*B
que ignora el asterisco, porque tiene el código de categoría 10.
El hecho es que los caracteres con código de categoría 10 sonnormalizadotener el código de carácter 32durante la tokenización. Sin embargo, cuando \uppercase
se aplica, la tokenización ya se realizó y el espacio tiene el código de carácter 32. Pero después \uppercase
el carácter se convierte en x
10 , lo cual ya no es válido para ser ignorado, porque no tiene el código de carácter 32.
Por lo tanto, la respuesta de que solo se ignoran los caracteres con código de carácter 32 y código de categoría 10 es correcta, pero engañosa si no se tiene en cuenta la normalización.
Respuesta2
tex.web tiene
begin if cur_tok=space_token then
para omitir los tokens ignorados donde space_token
está
@d space_token=@'5040 {$2^8\cdot|spacer|+|" "|$}
Respuesta3
Las secuencias de tokens de caracteres explícitos del código de caracteres 32 y categoría 10 (espacio) son las únicas cosas que TeX omite mientras "busca" el comienzo de un argumento no delimitado.
La cantidad⟨ficha espacial⟩de hecho, no es igual a "espacio único"/"token no en blanco" en el sentido de los párrafos de TeXbook citados por usted:
La cantidad⟨un espacio opcional⟩Se define como:
⟨un espacio opcional⟩→⟨ficha espacial⟩|⟨vacío⟩
Lo que sea⟨un espacio opcional⟩está permitido, también puede ser un token de espacio implícito.
Ver, por ejemplo,
\lowercase{\let\sptoken = } %
\edef\result{\number1234 }
\show\result
\edef\result{\number1234\sptoken}
\show\result
\let\result\sptoken\sptoken=\sptoken\TeX
\bye
(Aquí \lowercase
no hace más que quitar las llaves. De esta manera obtienes dos tokens de espacio explícitos del código de carácter 32 detrás de "=". El primero se descartará porque con \let
-assignments un espacio es opcional detrás de "=". El segundo no será descartado pero será el token cuyo significado se asigne a \sptoken
.)
\sptoken
es un token de espacio implícito.
Se descarta durante \number
la evaluación de TeX como un token espacial explícito.
También se descarta como cualquier otro.⟨espacio opcional⟩mientras realiza la segunda \let
tarea.
Pero TeX no se saltaría \sptoken
mientras "buscaba" el comienzo de un argumento no delimitado.
Entonces este ejemplo demuestra que la cantidad⟨ficha espacial⟩no es igual a "espacio único"/"token no en blanco" en el sentido de los párrafos de TeXbook citados por usted.
Por cierto:
Su pregunta se centra en cómo TeX trata los tokens mientras busca el comienzo de un argumento no delimitado.
Su pregunta se refiere a una etapa del procesamiento donde la tokenización ya está realizada.
Sin embargo, vale la pena mencionar un hecho relacionado con el proceso de tokenización de .tex-input:
Si, durante el proceso de tokenización de entrada .tex, TeX encuentra un carácter cuyo código de categoría es 10 (espacio) mientras el aparato de lectura está en el estado M (en medio de la línea), entonces TeX agregará un token de carácter explícito de categoría 10. (espacio) y código de carácter 32 al token-stream. Es decir, el token resultante tendrá el código de carácter 32 independientemente del número que tenga el punto de código del carácter de la entrada en cuestión.
Por ejemplo, la pestaña horizontal (la pestaña horizontal tiene el punto de código número 9 en ASCII) generalmente también tiene asignado el código de categoría 10. Por lo tanto, la tokenización de una pestaña horizontal generalmente produce un token de carácter explícito de categoría 10 (espacio) y código de carácter 32. Es decir, ese mismo token que TeX omite mientras "busca" el comienzo de un argumento no delimitado.