> 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/24-how-tex-calculates-glue-settings-in-an-hbox.md).

# Cómo calcula TeX los ajustes de glue en una \hbox

Este es el tercer y último artículo de una serie que analiza $$\mathrm \TeX$$ las cajas y el pegamento. La primera entrada [Cajas y pegamento: una breve, pero visual, introducción usando LuaTeX](/latex/es/articulos-en-profundidad/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md) introdujo los conceptos de cajas y pegamento y fue seguida por [La \hbox de Pandora: usando LuaTeX para levantar la tapa de las cajas de TeX](/latex/es/articulos-en-profundidad/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) que presentó un proyecto de Overleaf [$$\text{Lua}\mathrm\TeX$$basado en](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) para explorar las estructuras más profundas de $$\mathrm \TeX$$ las cajas mediante el uso de grafos de nodos. En esta parte final hacemos una “inmersión profunda” en la mecánica de cómo $$\mathrm \TeX$$ calcula los valores del pegamento en una `\hbox`: un proceso al que se hace referencia como *ajustar el pegamento*. Hacemos un uso extensivo de grafos de nodos (introducidos en el [La \hbox de Pandora: usando LuaTeX para levantar la tapa de las cajas de TeX](/latex/es/articulos-en-profundidad/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) en esta serie) y mostramos cómo usar e interpretar algunos de los datos que proporcionan: `glue_set`, `glue_sign` y `glue_order`.

Ofrecemos un ejemplo completamente desarrollado de cálculos de pegamento para una `\hbox` y cubrimos muchos detalles; sin embargo, puede haber circunstancias y consideraciones adicionales que no tenemos espacio para abordar aquí, y remitimos al lector interesado a la página 77 de $$\text{The } \mathrm \TeX \text{book}$$.

## El desafío

Supongamos que tenemos una `\hbox` como esta:

```latex
\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt%
B\hskip 0pt plus 2fil%
C\hskip 0pt plus 2fill%
D\hskip 0pt plus 3fill%
}
```

Así es como se ve esta caja —para mayor claridad, mostrada ampliada y con un borde:

![caja](/files/8d813b6b15ab77886a69f7305d1a657939368a5f)

La pregunta es: ¿cuál es el valor final, en $$\mathrm \TeX$$ puntos, del espacio (pegamento) entre los siguientes elementos:

* A y B
* B y C
* C y D
* D y el final de la caja

es decir, queremos calcular los valores del $$\mathrm{g}*{1}, \mathrm{g}*{2}, \mathrm{g}*{3} \text{ and } \mathrm{g}*{4}:$$

![pegamento](/files/2894951e1ad5e094a0b3dcda8cee5206276de69f)

Aquí hay un grafo de nodos que representa la caja anterior. De particular interés son tres valores contenidos en la sección de “metadatos”:

* `glue_set`
* `glue_sign`
* `glue_order`

![grafo de nodos](/files/a913c21bebd6a750626e1089ee2ae68922b34a77)

Es importante notar que un conjunto particular de valores de `glue_set`, `glue_sign` y `glue_order` solo afecta a los pegamentos dentro de la caja de nivel superior: no afectan a los pegamentos dentro de *anidadas* cajas: cada caja anidada (objeto hlist o vlist) tiene sus propios valores para estos tres parámetros. Aquí hay un ejemplo de una `\hbox` anidada dentro de una `\hbox`. En este ejemplo, puedes ver claramente los diferentes valores de `glue_set`—por supuesto, la caja anidada también puede tener valores diferentes para `glue_sign` y `glue_order`.

```latex
\hbox to 75pt{\hfill ABC\hbox to15pt{\hfill D}}
```

![grafo de nodos](/files/f870ac513661aa376efd2e9fe65f2b15834bce0b)

## Tipos de pegamento, infinitos y órdenes: un resumen

$$\mathrm \TeX$$ ofrece una serie de comandos primitivos relacionados con el pegamento, entre ellos:

* pegamento horizontal: `\hskip`, `\hfil`, `\hfill`, `\hfilneg`, `\hss`;
* pegamento vertical:`\vskip`, `\vfil`, `\vfill`, `\vfilneg`, `\vss`;

junto con `\mskip` para insertar pegamento en expresiones matemáticas.

Un elemento de pegamento se define por un conjunto de tres valores:

* **ancho natural**: cuánto espacio ocupa si no lo estiras ni lo contraes;
* **componente de estiramiento**: cuánto puede estirarse el pegamento;
* **componente de contracción**: cuánto puede contraerse el pegamento.

Lo que vamos a considerar es el uso del pegamento dentro de una `\hbox{...}` y los cálculos $$\mathrm \TeX$$ que usa para determinar cuánto espacio ocupará finalmente el pegamento. El comando que usaremos para crear algo de *horizontal* pegamento es `\hskip`, que toma la forma:

`**\hskip** *<ancho natural>* **plus** *<cantidad para estirar>* **minus** *<cantidad para contraer>*`

Para *vertical* pegamento que usarías `**\vskip** *<ancho natural>* **plus** *<cantidad para estirar>* **minus** *<cantidad para contraer>*`.

Por ejemplo, un pegamento horizontal típico se expresaría como `\hskip 3pt plus 2pt minus 1pt`. También puedes usar otras unidades físicas:

* `\hskip 3mm plus 2mm minus 1mm`
* `\hskip 3in plus 2in minus 1in`
* `\hskip 1in plus 3cm minus 20mm`

## $$\mathrm \TeX$$ pegamento y unidades de “infinito”

Para el componente de contracción o estiramiento del pegamento $$\mathrm \TeX$$ introduce otro tipo de unidad: los llamados “infinitos”: $$\text{fil}$$, $$\text{fill}$$ y $$\text{filll}$$. Estos tres “niveles de infinito” son tales que, cuando se enumeran en secuencia, cada uno es “más infinito” que el anterior:

$$\text{fil} < \text{fill} < \text{filll}$$

Quizá “infinitos” sea un nombre ligeramente confuso para estas unidades; también podría ayudar pensar en ellas como distintos niveles de *prioridad*, porque, en última instancia, ayudan a determinar qué pegamentos participan realmente en el proceso de estiramiento o contracción. Al tener pegamento con un componente de estiramiento o contracción “infinito”, $$\mathrm \TeX$$ te permite crear pegamento que puede estirarse o contraerse por la cantidad que desees. Ten en cuenta que, para pegamentos finitos, $$\mathrm \TeX$$ restringirá la cantidad en que tales pegamentos pueden contraerse. Un ejemplo de pegamento “infinito” es

`\hskip 3pt plus 2fil minus 1fill`

Nótese que no podemos escribir, por ejemplo, `\hskip 1fil` porque $$\mathrm \TeX$$ informará de un error con el mensaje `Unidad de medida ilegal (se insertó pt)`. En este punto, estos “niveles de infinito” pueden sonar muy extraños, pero, por ahora, acéptalo sin más y pronto veremos cómo $$\mathrm \TeX$$ usa estos infinitos al realizar cálculos de pegamento.

### Niveles de infinito (“orden del pegamento”)

Internamente, cuando $$\mathrm \TeX$$ realiza sus cálculos de pegamento, considera que cada nivel de infinito es un “orden de pegamento” que va de 0 a 3, donde el orden 0 corresponde al pegamento con dimensiones físicas como bp, pt, mm, etcétera. Sin embargo, con $$\text{Lua}\mathrm\TeX$$ hay una pequeña desviación porque en realidad tiene un tipo (orden) adicional de infinito que no está presente en muchos otros $$\mathrm \TeX$$ motores: $$\text{fi}$$ (véase la explicación abajo). Si lees $$\text{The } \mathrm \TeX\text{book}$$ no verás ninguna mención del $$\text{fi}$$ infinito —simplemente porque no está implementado en el $$\mathrm \TeX$$ software original de Knuth. En consecuencia, tenemos una ligera “desconexión” entre $$\text{Lua}\mathrm\TeX\text{'s}$$ el orden de los infinitos y los que podrías ver en libros sobre $$\mathrm \TeX$$. $$\text{Lua}\mathrm\TeX$$ usa infinitos cuyo orden va de 0 a 4, pero otros motores (comunes) $$\mathrm \TeX$$ van de 0 a 3. Aquí hay una tabla que muestra el orden de pegamento asignado a cada tipo de unidad de pegamento.

|                           |                               |     |     |      |       |
| ------------------------- | ----------------------------- | --- | --- | ---- | ----- |
|                           | Unidades físicas (pt, mm, in) | fi  | fil | fill | filll |
| $$\text{Lua}\mathrm\TeX$$ | 0                             | 1   | 2   | 3    | 4     |
| Otros motores             | 0                             | N/D | 1   | 2    | 3     |

### Notas sobre $$\text{Lua}\mathrm\TeX$$: ¿Por qué tener un infinito adicional?

$$\text{Lua}\mathrm\TeX$$ se deriva de una serie de proyectos y bibliotecas de código, incluido uno llamado [Omega](https://en.wikipedia.org/wiki/Omega_\(TeX\)). $$\text{Lua}\mathrm\TeX$$ incorporó ciertos aspectos del código de Omega, y eso incluye un nuevo tipo de pegamento infinito llamado $$\text{fi}$$. Del manual de Omega:

> “Se ha añadido un nuevo nivel de infinito $$\text{fi}$$ es menor que $$\text{fil}$$ pero mayor que cualquier cantidad finita. Su intención original era para el estiramiento entre letras: ya sea rellenar los espacios en blanco, como se hace en escrituras caligráficas como el árabe; o para énfasis, como en ruso; todo ello sin tener que reescribir los paquetes macro existentes. Por tanto, hay una nueva palabra clave, $$\text{fi}$$, y dos nuevos primitivos, `\hfi` y `\vfi`».

## Volviendo a nuestro desafío

Siguiendo el modelo de Knuth, definamos dos cantidades:

* el ancho deseado de una caja: $$\mathrm{W}\_{\mathrm{D}}$$—qué tamaño queremos que tenga;
* el ancho natural de una caja: $$\mathrm{W}\_{\mathrm{N}}$$—el espacio total ocupado por sus elementos constituyentes antes de que se estire o contraiga cualquier pegamento.

### El ancho natural de una caja

El ancho natural de una caja es el ancho total de todos los componentes de esa caja: caracteres, kerns, cajas anidadas y cualquier pegamento. Para el pegamento dentro de la caja, su ancho natural ignora cualquier estiramiento o contracción del pegamento: es decir, su tamaño antes de que tenga lugar cualquier estiramiento o contracción.

Una vez más, aquí está la caja que estamos examinando:

```latex
\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt%
B\hskip 0pt plus 2fil%
C\hskip 0pt plus 2fill%
D\hskip 0pt plus 3fill%
}
```

Está claro que queremos que la caja tenga 100pt de ancho; por tanto $$\mathrm{W}*{\mathrm{D}}=100\mathrm{pt}$$ pero ¿qué pasa con su ancho natural, $$\mathrm{W}*{\mathrm{N}}$$? Para calcular el ancho natural, está claro que necesitamos los anchos de los cuatro caracteres (A, B, C y D) más los anchos naturales de los cuatro pegamentos.

$$\eqalign{\mathrm{W}\_{\mathrm{N}} &= &\text{width(A)} + \text{width(B)} + \text{width(C)} + \text{width(D)} \ & &+ \text{width}(\verb\*\hskip 4pt plus3pt minus 2pt\*)\ & &+\text{width}(\verb\*\hskip 0pt plus 2fil\*)\ & &+\text{width}(\verb\*\hskip 0pt plus 2fill)*\ & &+\text{width}(\verb*\hskip 0pt plus 3fill\*)\ }$$

Donde $$\text{width}$$ es simplemente una notación para denotar el ancho natural de un elemento. Podemos obtener los anchos naturales de los cuatro caracteres (A, B, C y D) a partir de nuestro grafo de nodos:

![grafo de nodos](/files/13d4e9f39840df162a6fa66ae921dde8ddc486c6)

Del grafo de nodos anterior podemos ver que:

$$\eqalign{ \text{width(A)} &= 7.50002\text{pt}\ \text{width(B)} &= 7.08336\text{pt}\ \text{width(C)} &= 7.22223\text{pt}\ \text{width(D)} &= 7.6389\text{pt}\ }$$

Ahora, todo lo que necesitamos son los anchos naturales de nuestros pegamentos, que se obtienen fácilmente ignorando los componentes de estiramiento y contracción:

$$\eqalign{ &\text{width}(\verb\*\hskip 4pt plus3pt minus 2pt\*) & = 4\text{pt}\ &\text{width}(\verb\*\hskip 0pt plus 2fil\*) &=0\text{pt}\ &\text{width}(\verb\*\hskip 0pt plus 2fill)*&=0\text{pt}\ &\text{width}(\verb*\hskip 0pt plus 3fill\*)&=0\text{pt}\ }$$

Por tanto:

$$\eqalign{ \mathrm{W}\_{\mathrm{N}} & = \text{widths of characters} + \text{width of all glues}\ &= 7.50002\text{pt}+ 7.08336\text{pt} + 7.22223\text{pt} + 7.6389\text{pt} + 4\text{pt}\space \text{(from }\verb\*\hskip\*\text{)}\ &=33.4445\text{pt}\ }$$

Ahora tenemos dos piezas clave de información:

$$\eqalign{ \mathrm{W}*{\mathrm{D}} & = 100\text{pt}\ \mathrm{W}*{\mathrm{N}} & = 33.4445\text{pt}\ }$$

Está claro, $$\mathrm{W}*{\mathrm{D}} > \mathrm{W}*{\mathrm{N}}$$ y la diferencia es $$(100-33.4445)\text{pt}=66.5555\text{pt}$$; este espacio excedente tiene que llenarse estirando los pegamentos, pero ¿cuáles y cuánto?

### ¿Quién tiene más estiramiento?

Siguiendo la metodología de Knuth (página 77 de $$\text{The } \mathrm \TeX \text{book}$$), pero permitiendo el tipo adicional de infinito ($$\text{fi}$$) proporcionado por $$\text{Lua}\mathrm \TeX$$, el siguiente paso es anotar el *total* estiramiento de la caja en la forma:

$$\text{total stretch} = y\_{0}+ y\_{1}\text{fi} +y\_{2}\text{fil} +y\_{3}\text{fill} +y\_{4}\text{filll}$$

En primer lugar, si anotamos el $$\text{total glue}$$:

$$\text{total glue } = (\verb*4pt plus3pt minus 2pt*) + (\verb*0pt plus 2fil*) + (\verb*0pt plus 2fill*) + (\verb*0pt plus 3fill*)$$

podemos ver entonces que el $$\text{total stretch}$$ es:

$$\eqalign{ \text{total stretch} & = 3\text{pt}+ 0\text{fi} + (2\text{fil}) + (2\text{fill} + 3\text{fill}) + 0\text{filll}\ &=3\text{pt}+ 0\text{fi} + 2\text{fil} + 5\text{fill} + 0\text{filll}\ }$$

Comparándolo con $$\text{total stretch} = y\_{0}+ y\_{1}\text{fi} +y\_{2}\text{fil} +y\_{3}\text{fill} +y\_{4}\text{filll}\space$$podemos ver que:

$$\eqalign{ y\_0 &=3\text{pt}\ y\_1 &=0\ y\_2 &=2\ y\_3&=5\ y\_4&=0\ }$$

$$\mathrm\TeX$$ a continuación se “pregunta”: mirando el $$\text{total stretch}$$, ¿cuál es el nivel más alto de infinito con un valor distinto de cero? Al examinar el $$\text{total stretch}$$ de nuestra caja, está claro que el componente de estiramiento no nulo “más infinito” es $$\text{fill}$$ y tenemos $$y\_3=5$$ unidades de eso: son los pegamentos con un $$\text{fill}$$ componente de estiramiento los que proporcionan todo el estiramiento. El subíndice 3 de $$y\_3$$ nos dice el `glue_order` del pegamento que se usará —en este caso para estirar. Ahora, si miramos la sección de “metadatos” dentro de nuestro diagrama de nodos para este `\hbox` podemos dar sentido ahora a dos valores más de “metadatos” (abordaremos `glue_set` en la siguiente sección)

![metadatos](/files/fa104029b0f750fac900a9ce4d7ba2cd71e8bc89)

* `glue_sign`: te indica si el pegamento está ajustado a su longitud natural, estirado o contraído:
* 0=ajustado al ancho natural
* 1=estirar
* 2=contraer

En nuestro ejemplo, `glue_sign` tiene el valor de `1`, lo que significa que los pegamentos participantes deben estirarse.

* `glue_order` te indica qué “infinito” está involucrado; para $$\text{Lua}\mathrm \TeX$$ un valor de 3 te dice que los pegamentos con un $$\text{fill}$$ componente participarán en los cálculos de pegamento; en nuestro caso, se estirarán.

Cualquier pegamento que no tenga definido un componente de estiramiento en unidades de $$\text{fill}$$ será **ajustado a su longitud natural**: es decir, no se estirará en absoluto (en nuestro caso).

### Cuánto estirar o contraer: calculando glue\_set

Para resumir dónde estamos y lo que sabemos:

1. ancho deseado de la caja: $$\mathrm{W}\_{\mathrm{D}} = 100\text{pt}$$;
2. ancho natural de la caja: $$\mathrm{W}\_{\mathrm{N}} = 33.4445\text{pt}$$;
3. el pegamento tendrá que estirarse, pero solo los pegamentos con un $$\text{fill}$$ componente de estiramiento harán ese estiramiento;
4. tenemos un total de $$(2+3)=5$$ unidades de $$\text{fill}$$ disponibles.

La siguiente pregunta es: ¿cuánto se estirarán realmente esos pegamentos? Entra el *cociente de ajuste del pegamento*—al que se hace referencia como `glue_set` en nuestro grafo de nodos. Lo que $$\mathrm \TeX$$ hace es calcular cuánto espacio debe rellenarse y luego distribuir esa cantidad de espacio entre los pegamentos adecuados en proporción al tamaño de su componente de estiramiento. Si vuelves a mirar nuestro `\hbox` real, puedes ver exactamente qué pegamentos tienen componentes de estiramiento que contienen unidades de $$\text{fill}$$:

```latex
\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt%
B\hskip 0pt plus 2fil%
C\hskip 0pt plus 2fill%
D\hskip 0pt plus 3fill%
}
```

El $$\textit{glue set ratio }(\text{or } \verb*glue\_set*)$$ se calcula de la siguiente manera:

$$\eqalign{ \text{glue set ratio}\space (\verb*glue\_set*) = & {\text{amount to stretch}}\over{\text{value of highest infinity}}\ =& {\mathrm{W}*{\mathrm{D}}-\mathrm{W}*{\mathrm{N}}}\over{y\_3}\ =& {(100-33.4445)}\over{5}\ =& {66.5555}\over{5}\ =& 13.3111\space (\text{to 4 decimal places})\ }$$

Y ahora el paso final en el $$\mathrm\TeX$$ se aplica el algoritmo:

1. para cada elemento de pegamento cuyo componente de estiramiento coincida con el `glue_order` deseado (3 en nuestro caso), la longitud de ese pegamento pasará a ser:

$$\text{stretched value} = \text{natural length} + (\verb*glue\_set* \times \text{value of stretch component})$$

3. todos los demás pegamentos se ajustan a su longitud natural; es decir, no se estiran en absoluto.

Mirando los pegamentos de nuestra caja:

```latex
\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt%
B\hskip 0pt plus 2fil%
C\hskip 0pt plus 2fill%
D\hskip 0pt plus 3fill%
}
```

podemos repasarlos para calcular sus valores finales:

1. **Entre A y B**: `\hskip 4pt plus3pt minus 2pt`. El componente de estiramiento es `3pt`, que es de orden `0`. El `glue_order` es `3`requerido: se ignora el componente de estiramiento y este pegamento asume su ancho natural de `4pt`.
2. **Entre B y C**: `\hskip 0pt plus 2fil`. El componente de estiramiento es `2fil`, que es de orden `2`. El `glue_order` es `3`requerido: se ignora el componente de estiramiento y este pegamento asume su ancho natural de `0pt`.
3. **Entre C y D**: `\hskip 0pt plus 2fill`. El componente de estiramiento es `2fill`, que es de orden `3` y coincide con el `glue_order` de `3`. Este pegamento se estirará hasta: $$\eqalign{ \text{stretched value}\space = & \text{natural width} + (\verb*glue\_set* \times \text{value of stretch component})\ = & 0\text{pt} + 13.3111 \times 2 \ = & 26.6222\text{pt}\ }$$5. **Entre D y el final de la caja**: `\hskip 0pt plus 3fill`. El componente de estiramiento es `3fill`, que es de orden `3` y coincide con el `glue_order` de `3`. Este pegamento se estirará hasta: $$\eqalign{ \text{stretched value}\space = &\text{natural width} + (\verb*glue\_set* \times \text{value of stretch component})\ =& 0\text{pt} + 13.3111 \times 3 \ = &39.9333\text{pt}\ }$$

## Y, por último: comprobación del ancho total

El proceso de calcular el espacio real ocupado por el pegamento se llama *ajustar el pegamento* así que ahora podemos comprobar si hemos llenado la caja hasta el ancho deseado, $$(\mathrm{W}\_{\mathrm{D}} = \text{100pt})$$:

$$\eqalign{ \mathrm{W}\_{\mathrm{D}} & = \text{width of all characters} + \text{width of all }\textbf{set}\text{ glue values}\ & = \text{A:7.50002pt} + \text{B:7.08336pt} + \text{C:7.22223pt} + \text{D:7.6389pt}\ & + \text{4pt} + \text{0pt} + \text{26.6222pt} + \text{39.9333pt}\ & = \text{100.00pt} }$$

Ahora conocemos los anchos de todos los pegamentos y podemos preparar un gráfico que responde a la pregunta planteada al inicio de este artículo: aquí están los anchos de pegamento entre los caracteres en nuestra `\hbox`:

![pegamento](/files/94d91b2d6d6b00d39acbc7b997ffc9e0966ef0d2)


---

# 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/24-how-tex-calculates-glue-settings-in-an-hbox.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.
