> 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/overleaf-learn-latex-pt/artigos-aprofundados/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md).

# Como funciona \expandafter: um estudo detalhado de comandos \expandafter consecutivos

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

## Estudo de caso: Compreender \\\expandafter\\\expandafter\\\expandafter...

Macros avançadas, como as que se encontram em pacotes LaTeX, frequentemente fazem uso extensivo de múltiplos `\expandafter` comandos consecutivos para realizar sofisticados “malabarismos” de tokens. Para a maioria de nós, tais macros podem ser difíceis de compreender ou intimidantes de escrever. Nesta secção, iremos rever a mecânica subjacente ao processamento, por parte do TeX, de comandos consecutivos `\expandafter` comandos:

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

Para ajudar na nossa explicação, vamos adicionar subscritos a cada `\expandafter`—para indicar a qual nos estamos a referir:

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

Além disso, vamos estender a notação para os tokens processados por cada `\expandafter` a usar $$\mathrm{T^i\_1}$$ e $$\mathrm{T^i\_2}$$ a representar os tokens $$\mathrm{T\_1}$$ e $$\mathrm{T\_2}$$ lidos por `\expandafter` com o subscrito `i`: `\expandafter`<sub>i</sub> $$\mathrm{T^i\_1T^i\_2}$$. Também vamos assumir que dois tokens $$\mathrm{T\_X}$$ e $$\mathrm{T\_Y}$$ seguem após `\\expandafter<sub>3</sub>` para que a nossa entrada tenha o seguinte aspeto: `\\expandafter<sub>1</sub>\\expandafter<sub>2</sub>\\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$.

Quando o TeX começa a processar esta entrada, para `\\expandafter<sub>1</sub>` irá ver

* $$\mathrm{T^1\_1} =$$`\\expandafter<sub>2</sub>` que é guardado para reinserção posterior *reinserção* de volta na entrada
* $$\mathrm{T^1\_2} =$$`\\expandafter<sub>3</sub>`, que é expandida

Se voltarmos à nossa discussão anterior sobre o [código dentro do TeX](/latex/overleaf-learn-latex-pt/artigos-aprofundados/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) que implementa `\expandafter`, é com a expansão de `\\expandafter<sub>3</sub>` que vemos a recursão a ocorrer. Para processar `\\expandafter<sub>1</sub>` o TeX já chamou a sua função interna `expand()`, então, para processar (expandir) `\\expandafter<sub>3</sub>` o TeX está a fazer uma *segunda* chamada a `expand()`—a partir de dentro da `expand()` própria função.

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

* $$\mathrm{T^3\_1 = T\_X}$$, que é guardado para reinserção posterior *reinserção* de volta na entrada
* $$\mathrm{T^3\_2 = T\_Y}$$, que iremos assumir que é expansível

Vamos ainda assumir que a expansão de $$\mathrm{T\_Y}$$ produz a seguinte sequência de tokens: $$\mathrm{{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. Chegámos agora ao fim do processo de expansão iniciado pela sequência de comandos `\\expandafter<sub>1</sub>\\expandafter<sub>2</sub>\\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$ e o TeX procede a “desenrolar” o processo de recursão que começou com `\\expandafter<sub>1</sub>`.

Depois de processar `\\expandafter<sub>3</sub>` o TeX tem, na sua memória, uma lista de tokens contendo tokens da expansão de $$\mathrm{T\_Y\text{: }{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. O TeX começa agora a reinserir os tokens que guardou enquanto processava `\expandafter` comandos:

1. O TeX começa por reinserir o token $$\mathrm{T\_X}$$ guardado por `\\expandafter<sub>3</sub>`. $$\mathrm{T\_X}$$ é reinserido *à frente* da expansão de $$\mathrm{T\_Y}$$, o que resulta numa sequência de tokens: $$\mathrm{{{T\_X}T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$.
2. No entanto, ainda precisamos de concluir o processo iniciado por `\\expandafter<sub>1</sub>` que guardou o token que representa `\\expandafter<sub>2</sub>`
3. A sequência final de tokens montada pelo TeX, pronta para ser lida na próxima fase do processamento do TeX, é `\\expandafter<sub>2 (token)</sub>` $$\mathrm{T\_{X}T^1\_{Y}T^2\_{Y}T^3\_{Y}\cdots T^N\_Y}$$
4. O TeX terminou agora a “primeira ronda” do processamento e passa a ler a sequência de listas de tokens que gerou — essa sequência começa com `\\expandafter<sub>2 (token)</sub>` que o TeX procede a processar. Para `\\expandafter<sub>2</sub>` temos
   * $$\mathrm{T^2\_1} =\ \mathrm{T\_X}$$ que é guardado para reinserção posterior *reinserção* de volta na entrada
   * $$\mathrm{T^2\_2} = \mathrm{T^1\_Y}$$ que é o primeiro token resultante da expansão de $$\mathrm{T\_Y}$$; se for expansível, é expandido
5. Se assumirmos que o token $$\mathrm{T^1\_Y}$$, o primeiro token da expansão de $$\mathrm{T\_Y}$$, se expande para $$\mathrm{{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}}$$ então, depois de o TeX ter reinserido $$\mathrm{T\_X}$$, a sequência resultante de tokens a ser reprocessada pelo TeX seria: $$\mathrm{{T\_X}{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}{T^2\_Y}{T^3\_Y}\cdots{T^N\_Y}}$$

   que podemos reescrever como

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

O seguinte diagrama ilustra as listas de tokens criadas pelo código TeX

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

![Imagem mostrando o processamento pelo TeX de múltiplos comandos \\\expandafter](/files/7d037ed1a797a9e804c992a412e600156d371a0b)

### Da teoria à prática

A título de exemplo, definiremos as seguintes macros para servirem de $$\mathrm{T\_X}$$ e $$\mathrm{T\_Y}$$

* $$\mathrm{T\_X}=$$`\foo` onde definimos `\foo` como `\\def\\foo#1{\\textbf{#1}}`
* $$\mathrm{T\_Y}=$$`\\bar` onde primeiro definimos `\\def\\abc{Hello}`, `\\def\\xyz{, World!}` e depois `\\def\\bar{\\abc\\xyz}`

Usaremos o seguinte fragmento de código para demonstrar a nossa análise anterior:

\\\expandafter\\\expandafter\\\expandafter\\\foo\\\bar

A partir da nossa discussão, o resultado de `\\expandafter<sub>1</sub>\\expandafter<sub>2</sub>\\expandafter<sub>3</sub>` $$\mathrm{T\_X}\mathrm{T\_Y}$$ produz uma sequência de tokens da forma:

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

onde a sequência exata depende da natureza do token $$\mathrm{T\_Y}$$. Se inserirmos os nossos comandos de exemplo usando $$\mathrm{T\_X}=$$`\foo` e $$\mathrm{T\_Y}=$$`\\bar`, que é definido como `\\def\\bar{\\abc\\xyz}`, vemos:

* o primeiro token em $$\mathrm{T\_Y}$$ é `\\abc` e a sua expansão é uma sequência de tokens de caracteres: `Olá`
* os tokens restantes em $$\mathrm{T\_Y}$$ é o único token que representa `\\xyz`.

Se inserirmos esta informação na nossa “análise”, obtemos

$$\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\*}$$

Note que os subscritos <sub>token</sub> e <sub>lista de tokens (caracteres)</sub> são usados para enfatizar (lembrar-nos) que o TeX está a ler *valores inteiros de tokens*, e não *caracteres de texto*, daí não haver necessidade de mostrar quaisquer caracteres de espaço ou outros delimitadores depois de `\foo`: tais delimitadores já foram há muito processados ou descartados; aqui estamos firmemente no mundo interior do TeX, das listas de tokens e dos valores inteiros de tokens.

Quando o TeX processa a sequência de listas de tokens produzida pelos nossos `\expandafter` comandos, irá compor `**H**ello, World!`—apenas `H` é composto em negrito. Poderíamos obter o mesmo resultado escrevendo o código TeX equivalente `\\foo Hello\\xyz`. Observe que a definição de `\foo` usou um único parâmetro; consequentemente, `\foo` absorve o único `H` token de carácter como argumento, deixando os tokens de carácter restantes (`ello`) intocados.

**Notas:**

* escrever `\\foo\\bar` produz uma saída muito diferente: o token para `\\bar` seria usado como argumento para `\foo` o que resulta na composição **`Hello, World`**—tudo é composto em negrito.
* escrever `\\expandafter\\foo\\bar` faz com que `\\bar` seja expandido, o que produz dois tokens: $$\text{abc}*\text{token}\text{xyz}*\text{token}$$. Depois, após o $$\text{foo}*\text{token}$$ ser reinserido por `\expandafter` o TeX processa a sequência de tokens $$\text{foo}*\text{token}\text{abc}*\text{token}\text{xyz}*\text{token}$$ que compõe `**Hello**, World`—apenas **`Olá`** é composto em negrito. Aqui, o único token $$\text{abc}*\text{token}$$ é processado como argumento para o token da macro $$\text{foo}*\text{token}$$, deixando o token $$\text{xyz}\_\text{token}$$ intocado e o seu conteúdo composto com o tipo de letra atual.

## Nota sobre \\\expandafter e macros com argumentos

Ao usar `\expandafter` para forçar a expansão de macros, vale a pena saber como funciona a expansão de macros — particularmente para macros que recebem argumentos. Antes de o TeX poder executar uma macro — isto é, ler e processar os tokens contidos na definição da macro — o TeX precisa de preparar a macro “para executar” realizando o processo inicial de macro-expansão. Se a definição de uma macro incluir o uso de parâmetros (`#1`, `#2`, ... `#9`), parte do processo de macro-expansão exige que o TeX percorra a entrada à procura de tokens que constituam o(s) argumento(s) fornecido(s) pelo utilizador: esses tokens de argumento são absorvidos (removidos) da entrada. Durante a macro-expansão, o TeX lê e absorve tokens da entrada para criar mini listas de tokens, uma lista por argumento; essas listas de tokens serão subsequentemente inseridas no local apropriado dentro do corpo da macro — quando o TeX a executar. A etapa final da macro-expansão envolve o TeX localizar a definição da macro armazenada na memória e fazer com que esse local se torne a fonte a partir da qual o TeX lerá o seu próximo conjunto de tokens de entrada. A execução da macro começa quando o TeX passa a ler e processar esses tokens, fornecendo as listas de tokens criadas anteriormente para armazenar os argumentos.

### Os tokens delimitadores também são absorvidos

Se a definição original da macro também usasse tokens a atuar como delimitadores, o TeX também teria de comparar a definição original da macro com a utilização (chamada) dessa macro pelo utilizador, procurando encontrar e corresponder tokens delimitadores. Uma vez correspondidos/localizados, os tokens delimitadores são subsequentemente ignorados porque o seu único propósito é atuar como “pontuação”, ajudando o TeX a identificar e localizar os tokens reais destinados a formar cada argumento.

&#x20;[Parte 1](/latex/overleaf-learn-latex-pt/artigos-aprofundados/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md)   [Parte 2](/latex/overleaf-learn-latex-pt/artigos-aprofundados/22-how-does-expandafter-work-the-meaning-of-expansion.md)   [Parte 3](/latex/overleaf-learn-latex-pt/artigos-aprofundados/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md)   [Parte 4](/latex/overleaf-learn-latex-pt/artigos-aprofundados/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md)   [Parte 5](/latex/overleaf-learn-latex-pt/artigos-aprofundados/17-how-does-expandafter-work-a-detailed-macro-case-study.md)   [Parte 6](/latex/overleaf-learn-latex-pt/artigos-aprofundados/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/overleaf-learn-latex-pt/artigos-aprofundados/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.
