> 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/mas-temas/23-how-tex-macros-actually-work-part-5.md).

# Cómo funcionan realmente las macros de TeX: Parte 5

[Parte 1](/latex/es/mas-temas/19-how-tex-macros-actually-work-part-1.md) [Parte 2](/latex/es/mas-temas/20-how-tex-macros-actually-work-part-2.md) [Parte 3](/latex/es/mas-temas/21-how-tex-macros-actually-work-part-3.md) [Parte 4](/latex/es/mas-temas/22-how-tex-macros-actually-work-part-4.md) [Parte 5](/latex/es/mas-temas/23-how-tex-macros-actually-work-part-5.md) [Parte 6](/latex/es/mas-temas/24-how-tex-macros-actually-work-part-6.md)

## Introducción y panorama general

En la Parte 4 revisamos algunas propiedades básicas de las macros de TeX como preparación para los dos artículos siguientes, en los que examinamos de cerca la mecánica subyacente de las macros de TeX: listas de tokens especializadas. En estos dos artículos finales usamos diagramas, llamados listas de nodos, que fueron preparados a partir de datos generados usando una versión especialmente modificada del software original de TeX de Knuth: esas modificaciones fueron diseñadas para acceder a estructuras internas de datos de TeX que normalmente son inaccesibles para el usuario. Al “conectarnos” a las rutinas internas de procesamiento y ejecución de macros de TeX, fue posible generar datos gráficos que permiten una discusión más detallada y precisa del comportamiento de procesamiento de macros de TeX. Overleaf espera que estos diagramas ayuden a los lectores a lograr una mejor comprensión de cómo funcionan realmente las macros de TeX.

### Posible lectura adicional de contexto

Overleaf ya ha publicado dos artículos relacionados con tokens que proporcionan información adicional sobre los tokens de TeX y las listas de tokens de TeX. Tómate por favor un momento para consultarlos si necesitas cubrir alguna laguna en tu comprensión y ayudarte a sacar el máximo provecho de las Partes 5 y 6 de esta serie.

* [¿Qué es un "token de TeX"?](/latex/es/articulos-en-profundidad/53-what-is-a-tex-token.md)
* [¿Qué es una lista de tokens de TeX?](/latex/es/articulos-en-profundidad/54-what-is-a-tex-token-list.md)

## Las macros como listas de tokens

Cuando TeX detecta un comando de creación de macro (`\def`, `\edef`, `\gdef` o `\xdef`) dentro del flujo de entrada, activa un proceso que convierte ambas secciones `<texto de parámetros><texto de reemplazo>` de la definición de nuestra macro en una sola lista larga de tokens, pero de un tipo de lista de tokens muy particular.

Las listas de tokens para macros son ligeramente diferentes de otras listas de tokens usadas dentro de TeX porque contienen valores de tokens “especiales” que solo los procesos internos de TeX pueden crear/generar: esos tokens especiales no pueden ser creados directamente por ningún comando que puedas incluir en tu archivo .tex. TeX crea y usa esos valores de tokens “especiales” para ayudar a procesar la llamada a tu macro, como exploraremos y explicaremos a continuación.

### Una breve palabra sobre cómo se almacenan las listas de tokens: nodos

Para almacenar una lista de tokens (valores enteros), TeX usa una estructura de datos llamada [lista enlazada](https://en.wikipedia.org/wiki/Linked_list), que, en el caso de TeX, comprende una lista de los llamados *nodos*. Puedes pensar en un nodo como un pequeño paquete de memoria de ordenador que puede usarse para almacenar un conjunto de elementos de datos. Para almacenar una macro, estos nodos se encadenan como una cadena, donde cada nodo (eslabón de la cadena) puede almacenar varias piezas de información, incluyendo un valor de token y la dirección de memoria del siguiente nodo de la lista. Para más información, puedes leer el artículo [¿Qué es una lista de tokens de TeX](/latex/es/articulos-en-profundidad/54-what-is-a-tex-token-list.md) pero el siguiente diagrama resume las características clave de una macro almacenada como una lista de tokens:

![Diagrama de una lista de tokens de una macro de TeX almacenada como una lista enlazada de nodos](/files/2183f750fa803661fb6bd0a90264cfbd4def7472)

### Recordatorio: las 4 partes de una definición de macro

Como se discutió en la Parte 4, la estructura de cualquier macro puede escribirse como:

```
<primitiva de macro de TeX><nombre de macro><texto de parámetros>{<texto de reemplazo>}
```

donde:

* `<primitiva de macro de TeX>` = una de `\def`, `\edef`, `\gdef` o `\xdef`;
* `<nombre de macro>`=el nombre de tu macro, como `\\foo`;
* `<texto de parámetros>` puede ser “nulo” (no presente) o puede ser una cadena de tokens delimitadores y tokens de parámetros de macro;
* `<texto de reemplazo>` es el cuerpo real de tu macro: la sección que se “ejecuta” cuando llamas a la macro.

**NOTA**: (Como también se observó en la Parte 4) a lo largo de la discusión asumimos que `<nombre de macro>` irá seguido de un carácter de espacio de código de categoría 10 para actuar como delimitador y terminar el `<nombre de macro>`. Nosotros *no hemos* mostrado explícitamente ese carácter de espacio en nuestro texto/discusión, pero asumimos que está ahí. Estrictamente hablando, deberíamos representarlo algo así:

```
<primitiva de macro de TeX><nombre de macro><espacio><texto de parámetros>{<texto de reemplazo>}
```

Sin embargo, omitiremos la inclusión explícita de un `<espacio>` carácter y asumiremos implícitamente su presencia.

**NOTA**: Los caracteres `{` y `}` *no* se convierten en parte de la lista de tokens de la macro: su propósito es simplemente indicarle al analizador de entrada de TeX (que crea tokens) dónde `<texto de reemplazo>` empieza y termina.

Cuando TeX define una macro, las secciones `<texto de parámetros><texto de reemplazo>` se convierten en una sola lista de tokens continua: el número total de tokens en esa lista depende de la complejidad de la macro. Como hemos visto, la sección tiene el propósito específico de actuar como una “plantilla de tokens” o “modelo” que TeX utiliza para seleccionar los tokens que forman los argumentos (valores) a usar con la macro real: es decir, los tokens que se introducirán en la `<texto de reemplazo>`.

Para consolidar estas ideas, tomemos un ejemplo de macro, pero mantengámoslo breve para que los diagramas posteriores no se vuelvan demasiado recargados:

```
\def\foo A#1\fake{123 #1}
```

Para nuestra macro, `\\foo`

* `<texto de parámetros>` = `A#1\fake`
* `<texto de reemplazo>` = `123 #1`

Aunque este ejemplo es una macro sencilla, contiene todas las características que necesitamos explorar.

Como se señaló, TeX convertirá `<texto de parámetros><texto de reemplazo>` en una sola lista larga de tokens que puedes ver en el diagrama de abajo. En nuestro ejemplo, los tokens formados a partir de `A#1\fake{123 #1}` han sido convertidos en una secuencia consecutiva de tokens almacenados en una lista de tokens (como una lista enlazada de nodos).

## Gráfico que muestra una lista real de tokens de una macro

El siguiente diagrama, que muestra cómo se almacena la macro, `\def\foo A#1\fake{123 #1}` usa datos reales del interior de un motor TeX. Fue creado usando una [versión personalizada de TeX de Knuth](/latex/es/articulos-en-profundidad/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md#how-can-you-study-tex-tokens3f) que se modificó con código adicional para interceptar llamadas a macros, examinar los datos internos de TeX y exportarlos en un formato para su procesamiento usando un programa gráfico de código abierto llamado [Graphviz](https://www.graphviz.org/).

Puedes descargar el siguiente gráfico como un [archivo PDF](https://assets.ctfassets.net/nrgyaltdicpt/N6gT757eXCxRV3FtdPPga/7ce120dc05ed05962bb911ff1124734b/annotatednodelist-plain.pdf) (675 KB) o [archivo SVG](https://images.ctfassets.net/nrgyaltdicpt/4PkmtHDhO8KF892ZDWuLHP/2c9c8385c6948fd122b228c5c780a3a6/annotatednodelist-plain.svg) (1,8 MB).

![Diagrama de una lista de tokens de TeX anotada](/files/67bddd0a9a695a9551028fa1d3c81ca5ea46896f)

#### Entendiendo los nodos

En el diagrama anterior verás que cada nodo contiene dos elementos de datos llamados el **nodo siguiente** y el **nodo actual**. Son simplemente valores enteros que representan ubicaciones de memoria dentro de TeX: ubicaciones donde se almacenan otros nodos. Los valores de **nodo siguiente** y **nodo actual** no son importantes, simplemente almacenan las ubicaciones (direcciones de memoria) que permiten enlazar los nodos entre sí en una lista.

![El significado de nodo siguiente y nodo actual](/files/9a80a78e2a3c60f515b7d4e27131578884f554d4)

#### Volvamos al ejemplo

En el diagrama de nodos, la lista de tokens formada a partir de `A#1\fake{123 #1}` contiene varios “tokens especiales” introducidos al inicio de este artículo. Además, la lista de nodos que representa nuestra macro comienza con un “primer nodo especial”: exploraremos qué son y qué hacen.

El primer elemento de una lista de tokens de una macro (y de algunos otros tipos de listas de tokens) no almacena un valor de token, sino un elemento de datos llamado *contador de referencias* que TeX usa para seguir el uso de la macro.

![Un nodo de contador de referencias es el primero en una lista de tokens](/files/2f698aa4fef4d20c87a0807b5188e06c72e459f5)

El primer token de la `<texto de parámetros>` se almacena en el nodo que sigue inmediatamente al contador de referencias: puedes ver que es un token que representa la letra `A` con código de categoría 11. Por las discusiones en las Partes 2 y 3 sabemos que un token de carácter se calcula usando

$$\text{token value}=256\times \text{category code} + \text{character code}$$

lo cual, para una letra `A` con código de categoría 11, es

$$\text{token value}=256\times 11 + 65$$

dando el valor 2881, como se muestra en el nodo.

#### El “comando” \fake usado en \foo

Dentro de nuestra definición de macro `\def\foo A#1\fake{123 #1}` uno de los delimitadores es un *no definido* comando `\fake` que se almacena dentro de la lista de tokens como parte de la `<texto de parámetros>` sección. Como puedes ver, dentro de la lista general de tokens de la macro `\fake` hay un token cuyo valor es `19491`—un valor entero calculado por TeX usando la fórmula discutida en la Parte 3. Cuando TeX intenta ejecutar `\\foo` esperará encontrar el `\fake` valor del token al final de la `<texto de parámetros>` sección. TeX *no* intentará ejecutar el `\fake` comando porque su función es meramente proporcionar una forma de “puntuación” dentro de la `<texto de parámetros>` “plantilla de tokens”.

![Uso de un token de comando como delimitador de macro](/files/29e48796809923850fb6c40ecfee9995b9fee9a0)

#### Tokens especiales en la lista de tokens

**El token de “fin de coincidencia”**

Al llamar a una macro, la primera tarea de TeX es examinar la macro tal como la escribió el usuario y comparar los tokens presentes en la `<texto de parámetros>` sección del usuario con los tokens contenidos en la plantilla `<texto de parámetros>` almacenada en memoria (creada en el momento en que se definió la macro). Debido a que la definición completa de la macro, construida a partir de `<texto de parámetros><texto de reemplazo>` se almacena como una larga lista consecutiva de tokens, TeX necesita saber dónde, en esa lista de tokens, `<texto de parámetros>` *se detiene* y dónde `<texto de reemplazo>` *comienza*. **fin de coincidencia** token como el último token del conjunto de tokens generado a partir de `<texto de parámetros>`. El **fin de coincidencia** token no puede generarse a partir de comandos del usuario; solo TeX puede crearlo, por lo tanto TeX está seguro de detectar el final de la `<texto de parámetros>`.

![Mostrando el token de fin de coincidencia en una lista de tokens de TeX](/files/69f5d40d5c8c069e9742fcd56237fe6186d8afc5)

Aquí podemos ver que el primer token que sigue después de **fin de coincidencia** es un token que representa el dígito `1` con código de categoría 12. Esto debería esperarse porque la `<texto de reemplazo>` de nuestra macro `\\foo` es `123 #1`—es decir, comienza con el token que representa el dígito `1` (con código de categoría 12).

Por la discusión en las Partes 2 y 3 sabemos que un token de carácter se calcula usando

$$\text{token value}=256\times \text{category code} + \text{character code}$$

lo cual, para un dígito `1` con código de categoría 12 es

$$\text{token value}=256\times 12 + 49$$

dando el valor de token 3121, como se muestra en el nodo.

**tokens de “parámetro de coincidencia”**

Cuando TeX almacena la definición de la macro, convierte cualquier token de parámetro (`#1`, `#2`… `#9`) dentro de `<texto de parámetros>` a uno llamado **parámetro de coincidencia** token. Estos tokens le indican a TeX que necesita empezar a buscar, dentro de la llamada de la macro hecha por el usuario, los tokens que son los argumentos de la macro.

![Mostrando el token de parámetro de coincidencia en una lista de tokens de TeX](/files/a029ff3e262ca7d1d36e40e9b9fb4fb32c79e932)

### Tokens especiales en la lista de tokens

#### tokens de “parámetro de salida”

Cuando TeX ha procesado todo y está listo para ejecutar de verdad (expandir) la macro, los **parámetro de salida** tokens indican a TeX las ubicaciones dentro de la `<texto de reemplazo>` donde necesita introducir los tokens que representan los argumentos proporcionados por el usuario cuando se llamó a la macro. En efecto, “En esta ubicación, inserta los tokens que representan el argumento n del usuario, donde n=1...9”.

Dentro de la `<texto de reemplazo>` sección de la lista de tokens de la definición de macro almacenada habrá un **parámetro de salida** token correspondiente a cada `#1`, `#2`... `#9` presente en la definición original.

![Mostrando el token de parámetro de salida en una lista de tokens de TeX](/files/a422ce14e6e7249aba6ac08af63ff21f33a25879)

Si miramos nuestra definición de `\\foo` (`\def\foo A#1\fake{123 #1}`) vemos que solo hay 1 parámetro de macro (`#1`) en la `<texto de parámetros>` (`A#1\fake`) y, posteriormente, solo 1 parámetro de macro (`#1`) aparece en la `<texto de reemplazo>` (`123 #1`): esto da como resultado solo 1 **parámetro de salida** token presente en la lista de tokens que representa la `<texto de reemplazo>`.

Obsérvese lo siguiente en la lista de nodos que representa `\\foo`de `<texto de reemplazo>`:

* el token inmediatamente anterior al **parámetro de salida** token representa un carácter de espacio (código de categoría 10, código de carácter 32) porque hay un espacio entre el `123` y el parámetro de macro (`#1`) en la definición original de `\\foo`;
* la **parámetro de salida** es el último token de la lista: el **nodo siguiente** tiene un valor especial de “nulo” (que significa “vacío”) que se usa para terminar la lista: no hay más nodos después de **parámetro de salida** porque es el token final, indicando el final de la `<texto de reemplazo>` y, por tanto, el final de la definición de la macro.

## Parte 6

En la Parte 6 usamos algunos gráficos detallados para explicar y explorar el significado exacto de la expansión de macros y las consecuencias de la tokenización de los argumentos de macro por parte de TeX antes de introducirlos en la `<texto de reemplazo>`.

[Parte 1](/latex/es/mas-temas/19-how-tex-macros-actually-work-part-1.md) [Parte 2](/latex/es/mas-temas/20-how-tex-macros-actually-work-part-2.md) [Parte 3](/latex/es/mas-temas/21-how-tex-macros-actually-work-part-3.md) [Parte 4](/latex/es/mas-temas/22-how-tex-macros-actually-work-part-4.md) [Parte 5](/latex/es/mas-temas/23-how-tex-macros-actually-work-part-5.md) [Parte 6](/latex/es/mas-temas/24-how-tex-macros-actually-work-part-6.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/mas-temas/23-how-tex-macros-actually-work-part-5.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.
