
Tengo el siguiente código Tex simple:
\def\xx{ABC}
\def\temp #1 {\def\tempii{#1}}
\temp\xx a b c
\tempii\tempii
Espero ver el siguiente resultado:
a b c ABCABC
Pero en realidad veo esto:
b c ABCaABCa
¿Por qué se incluye la 'a' en la definición de \tempii?
Respuesta1
Todavía estoy pensando por qué es así, pero esta revisión (que incluye \xx
) le brinda lo que desea.
Creo que la respuesta es que, en el uso \temp\xx a b c
, el espacio posterior \xx
es desde la vista del analizador TeX, no es un espacio en absoluto, sino que simplemente significa el final del nombre de la macro \xx
. Por ejemplo, si simplemente coloca \xx A
una línea sola, verá que se imprime ABCA
sin espacios. Por lo tanto, el analizador absorbe la "A" final como si estuviera conectada a \xx
. También se podría usar \temp\xx{} a b c
, como una forma de decirle al analizador que el espacio es un separador, y no solo el siguiente carácter que sigue a \xx
.
\documentclass{article}
\begin{document}
\def\xx{ABC}
\def\temp #1 {\def\tempii{#1}}
\temp{\xx} a b c
\tempii\tempii
\end{document}
Respuesta2
Para mayor claridad, denotaré las fichas de espacio con •
, ya que son muy importantes en la discusión; Los espacios en los siguientes ejemplos de código deben ignorarse.
El texto del parámetro \temp
es
#1•
mientras que el texto de reemplazo es
\def\tempii{#1}
Tu llamada \temp
es
\temp\xx a•b•c•\tempii\tempii
Observe que después \xx
hay un espacio solo para delimitar la macro; esnoun token de espacio: no es nada, porque TeX siempre ignora los espacios después del controlpalabras(no controlarsimbolos). El espacio posterior c
proviene del final de línea de su código.
Los siguientes tokens \temp
se escanean (sin expansión) para encontrar una coincidencia con el texto del parámetro, donde el argumento está delimitado por un espacio, por lo que #1
termina siendo \xx a
y el siguiente estado del flujo de entrada es
\def\tempii{\xx a}b•c•\tempii\tempii
Ahora TeX realiza la definición y la elimina del flujo de entrada:
b•c•\tempii\tempii
y la pieza b•c•
pasa a la etapa de composición tipográfica. Después de la expansión de las dos copias de \tempii
, esto equivale a haber escrito
b•c•\xx a\xx a
o
b•c•ABCaABCa
que es exactamente lo que tienes.
Si se hubieran utilizado \?
en lugar de \xx
las dos últimas líneas se habrían convertido en
\temp\?•a•b•c•\tempii\tempii
porque \?
es un símbolo de control y TeX no ignora los espacios después de ellos. En este caso el resultado sería
a•b•c•ABCABC
Tenga en cuenta que
\expandafter\temp\xx a•b•c
\tempii\tempii
produciría el mismo resultado, porque después de la acción de \expandafter
TeX se presentaría con
\temp ABCa•b•c
(la misma convención para espacios que antes, por supuesto). Obtendrías el mismo resultado que con \?
en lugar de \xx
con
\expandafter\temp\expandafter\xx\space a•b•c
porque entonces TeX se presentaría con
\temp\xx•a•b•c
De hecho, los espacios se ignoran después de las palabras de control sólo durante el proceso de tokenización.