> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/es/articulos-en-profundidad/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md).

# Cómo funciona \expandafter: un estudio detallado de comandos \expandafter consecutivos

&#x20;[Parte 1](/latex/es/articulos-en-profundidad/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md)   [Parte 2](/latex/es/articulos-en-profundidad/22-how-does-expandafter-work-the-meaning-of-expansion.md)   [Parte 3](/latex/es/articulos-en-profundidad/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md)   [Parte 4](/latex/es/articulos-en-profundidad/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md)   [Parte 5](/latex/es/articulos-en-profundidad/17-how-does-expandafter-work-a-detailed-macro-case-study.md)   [Parte 6](/latex/es/articulos-en-profundidad/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md)&#x20;

## Estudio de caso: Entendiendo \expandafter\expandafter\expandafter...

Las macros avanzadas, como las que se encuentran en paquetes de LaTeX, a menudo hacen un uso extensivo de múltiples `\expandafter` comandos consecutivos para realizar un sofisticado “malabarismo” de tokens. Para la mayoría de nosotros, estas macros pueden ser difíciles de entender o intimidantes de escribir. En esta sección revisaremos la mecánica subyacente al procesamiento de TeX de comandos consecutivos `\expandafter` comandos:

```
\expandafter\expandafter\expandafter...
```

Para ayudar en nuestra explicación, añadiremos subíndices a cada `\expandafter`—para indicar a cuál nos estamos refiriendo:

```
        \expandafter1\expandafter2\expandafter3...
```

Además, ampliaremos la notación para los tokens procesados por cada `\expandafter` para usar $$\mathrm{T^i\_1}$$ y $$\mathrm{T^i\_2}$$ que representan los tokens $$\mathrm{T\_1}$$ y $$\mathrm{T\_2}$$ leídos por `\expandafter` con subíndice `i`: `\expandafter`<sub>i</sub> $$\mathrm{T^i\_1T^i\_2}$$. También asumiremos que dos tokens $$\mathrm{T\_X}$$ y $$\mathrm{T\_Y}$$ siguen después de `\expandafter<sub>3</sub>` para que nuestra entrada se vea así: `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$.

Cuando TeX comienza a procesar esta entrada, para `\expandafter<sub>1</sub>` verá

* $$\mathrm{T^1\_1} =$$`\expandafter<sub>2</sub>` que se guarda para su posterior *re-inserción* de vuelta en la entrada
* $$\mathrm{T^1\_2} =$$`\expandafter<sub>3</sub>`, que se expande

Si volvemos a nuestra discusión anterior sobre el [código dentro de TeX](/latex/es/articulos-en-profundidad/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) que implementa `\expandafter`, es con la expansión de `\expandafter<sub>3</sub>` que vemos que tiene lugar la recursión. Para procesar `\expandafter<sub>1</sub>` TeX ya ha llamado a su función interna `expand()`, así que para procesar (expandir) `\expandafter<sub>3</sub>` TeX está haciendo una *segunda* llamada a `expand()`—desde dentro de la `expand()` misma función.

Para `\expandafter<sub>3</sub>` tenemos

* $$\mathrm{T^3\_1 = T\_X}$$, que se guarda para su posterior *re-inserción* de vuelta en la entrada
* $$\mathrm{T^3\_2 = T\_Y}$$, que asumiremos que es expandible

Supongamos además que la expansión de $$\mathrm{T\_Y}$$ arroja la siguiente secuencia de tokens: $$\mathrm{{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. Hemos llegado ahora al final del proceso de expansión iniciado por la secuencia de comandos `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$ y TeX procede a “desenrollar” el proceso de recursión que comenzó con `\expandafter<sub>1</sub>`.

Después de procesar `\expandafter<sub>3</sub>` TeX tiene, en su memoria, una lista de tokens que contiene tokens de la expansión de $$\mathrm{T\_Y\text{: }{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. TeX ahora comienza a reinsertar los tokens que guardó mientras procesaba `\expandafter` comandos:

1. TeX comienza reinsertando el token $$\mathrm{T\_X}$$ guardado por `\expandafter<sub>3</sub>`. $$\mathrm{T\_X}$$ se reintroduce *delante* de la expansión de $$\mathrm{T\_Y}$$, lo que da como resultado una secuencia de tokens: $$\mathrm{{{T\_X}T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$.
2. Sin embargo, todavía necesitamos completar el proceso iniciado por `\expandafter<sub>1</sub>` que guardó el token que representa `\expandafter<sub>2</sub>`
3. La secuencia final de tokens ensamblada por TeX, lista para ser leída en la siguiente etapa del procesamiento de TeX, es `\expandafter<sub>2 (token)</sub>` $$\mathrm{T\_{X}T^1\_{Y}T^2\_{Y}T^3\_{Y}\cdots T^N\_Y}$$
4. TeX ha terminado ahora la “primera ronda” de procesamiento y pasa a leer la secuencia de listas de tokens que ha generado —esa secuencia comienza con `\expandafter<sub>2 (token)</sub>` que TeX procede a procesar. Para `\expandafter<sub>2</sub>` tenemos
   * $$\mathrm{T^2\_1} =\ \mathrm{T\_X}$$ que se guarda para su posterior *re-inserción* de vuelta en la entrada
   * $$\mathrm{T^2\_2} = \mathrm{T^1\_Y}$$ que es el primer token resultante de la expansión de $$\mathrm{T\_Y}$$; si es expandible, se expande
5. Si asumimos que el token $$\mathrm{T^1\_Y}$$, el primer token de la expansión de $$\mathrm{T\_Y}$$, se expande a $$\mathrm{{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}}$$ entonces, después de que TeX haya reinsertado $$\mathrm{T\_X}$$, la secuencia de tokens resultante que TeX volvería a procesar sería: $$\mathrm{{T\_X}{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}{T^2\_Y}{T^3\_Y}\cdots{T^N\_Y}}$$

   que podemos reformular como

   $$\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}$$

El siguiente diagrama ilustra las listas de tokens creadas por el código de TeX

```
    \expandafter1\expandafter2\expandafter3TXTY
```

![Imagen que muestra a TeX procesando múltiples comandos \expandafter](/files/831fdc4ea3567ddd8e65b5fb9b454be84f760fdb)

### De la teoría a la práctica

A modo de ejemplo, definiremos las siguientes macros para servir como $$\mathrm{T\_X}$$ y $$\mathrm{T\_Y}$$

* $$\mathrm{T\_X}=$$`\foo` donde definimos `\foo` como `\def\foo#1{\textbf{#1}}`
* $$\mathrm{T\_Y}=$$`\bar` donde primero definimos `\def\abc{Hello}`, `\def\xyz{, World!}` y luego `\def\bar{\abc\xyz}`

Usaremos el siguiente fragmento de código para demostrar nuestro análisis anterior:

\expandafter\expandafter\expandafter\foo\bar

Según nuestra discusión, el resultado de `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_X}\mathrm{T\_Y}$$ produce una secuencia de tokens de la forma:

$$\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}$$

donde la secuencia exacta depende de la naturaleza del token $$\mathrm{T\_Y}$$. Si insertamos nuestros comandos de ejemplo usando $$\mathrm{T\_X}=$$`\foo` y $$\mathrm{T\_Y}=$$`\bar`, que se define como `\def\bar{\abc\xyz}`, vemos:

* el primer token en $$\mathrm{T\_Y}$$ es `\abc` y su expansión es una secuencia de tokens de caracteres: `Hello`
* los tokens restantes en $$\mathrm{T\_Y}$$ es el único token que representa `\xyz`.

Si incorporamos esta información a nuestro “análisis”, obtenemos

$$\begin{align\*} &\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}\ &=\text{foo}*{\text{token}}\text{\<expansion of \abc>}*\text{token list (characters)}\text{xyx}*\text{token}\ &=\text{foo}*\text{token}\text{Hello}*\text{token list (characters)}\text{xyx}*\text{token}\\\[10pt] \end{align\*}$$

Observe que los subíndices <sub>token</sub> y <sub>lista de tokens (caracteres)</sub> se usan para enfatizar (recordarnos) que TeX está leyendo *valores enteros de tokens*, no *caracteres de texto*, por lo tanto no es necesario mostrar ningún carácter de espacio ni otros delimitadores después de `\foo`: esos delimitadores hace mucho que han sido procesados o descartados; aquí estamos firmemente en el mundo interno de TeX de listas de tokens y valores enteros de tokens.

Cuando TeX procesa la secuencia de listas de tokens producida por nuestros `\expandafter` comandos, compondrá `**H**ola, Mundo!`—solo `H` se compone en negrita. Podríamos lograr el mismo resultado escribiendo el código TeX equivalente `\foo Hello\xyz`. Observe que la definición de `\foo` usaba un solo parámetro; en consecuencia, `\foo` absorbe el único `H` token de carácter para su argumento, dejando los tokens de carácter restantes (`ello`) intactos.

**Notas:**

* escribir `\foo\bar` produce una salida muy diferente: el token de `\bar` se usaría como argumento para `\foo` lo que da como resultado la composición de **`Hola, Mundo`**—todo se compone en negrita.
* escribir `\expandafter\foo\bar` provoca `\bar` que se expanda, lo que produce dos tokens: $$\text{abc}*\text{token}\text{xyz}*\text{token}$$. Luego, después del $$\text{foo}*\text{token}$$ es reinsertado por `\expandafter` TeX procese la secuencia de tokens $$\text{foo}*\text{token}\text{abc}*\text{token}\text{xyz}*\text{token}$$ que compone `**Hola**, Mundo`—solo **`Hello`** se compone en negrita. Aquí, el único token $$\text{abc}*\text{token}$$ se procesa como argumento para el token de macro $$\text{foo}*\text{token}$$, dejando el token $$\text{xyz}\_\text{token}$$ intacto y su contenido compuesto en la fuente actual.

## Nota sobre \expandafter y macros con argumentos

Al usar `\expandafter` Para forzar la expansión de macros, conviene saber cómo funciona la expansión de macros —en particular para las macros que toman argumentos. Antes de que TeX pueda ejecutar una macro —es decir, leer y procesar los tokens contenidos dentro de la definición de la macro—, TeX necesita preparar la macro “para ejecutarse” realizando el proceso inicial de expansión de la macro. Si la definición de una macro incluye el uso de parámetros (`#1`, `#2`, ... `#9`), parte del proceso de expansión de la macro requiere que TeX examine la entrada buscando tokens que compongan el/los argumento(s) proporcionado(s) por el usuario: esos tokens de argumento se absorben (se eliminan) de la entrada. Durante la expansión de la macro, TeX lee y absorbe tokens de la entrada para crear pequeñas listas de tokens, una lista por argumento; esas listas de tokens se insertarán posteriormente en la ubicación adecuada dentro del cuerpo de la macro —cuando TeX la ejecute. El paso final en la expansión de la macro implica que TeX localice la definición de la macro almacenada en memoria y haga que esa ubicación se convierta en la fuente desde la cual TeX leerá su siguiente conjunto de tokens de entrada. La ejecución de la macro comienza cuando TeX empieza a leer y procesar esos tokens, alimentando las listas de tokens creadas previamente para almacenar los argumentos.

### Los tokens delimitadores también se absorben

Si la definición original de la macro también usara tokens que actúan como delimitadores, TeX también tendría que comparar la definición original de la macro con el uso (llamada) que hace el usuario de esa macro, buscando encontrar y hacer coincidir los tokens delimitadores. Una vez emparejados/localizados, los tokens delimitadores se ignoran posteriormente porque su único propósito es actuar como “puntuación”, ayudando a TeX a identificar y distinguir los tokens reales destinados a formar cada argumento.

&#x20;[Parte 1](/latex/es/articulos-en-profundidad/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md)   [Parte 2](/latex/es/articulos-en-profundidad/22-how-does-expandafter-work-the-meaning-of-expansion.md)   [Parte 3](/latex/es/articulos-en-profundidad/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md)   [Parte 4](/latex/es/articulos-en-profundidad/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md)   [Parte 5](/latex/es/articulos-en-profundidad/17-how-does-expandafter-work-a-detailed-macro-case-study.md)   [Parte 6](/latex/es/articulos-en-profundidad/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/es/articulos-en-profundidad/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
