¿Por qué el personaje que sigue esta macrodefinidora está engullido?

¿Por qué el personaje que sigue esta macrodefinidora está engullido?

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 \xxes 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 Auna línea sola, verá que se imprime ABCAsin 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 \tempes

#1•

mientras que el texto de reemplazo es

\def\tempii{#1}

Tu llamada \tempes

\temp\xx a•b•c•\tempii\tempii

Observe que después \xxhay 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 cproviene del final de línea de su código.

Los siguientes tokens \tempse 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 #1termina siendo \xx ay 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 \xxlas 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 \expandafterTeX 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 \xxcon

\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.

información relacionada