> 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/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md).

# La \hbox de Pandora: usando LuaTeX para levantar la tapa de las cajas de TeX

## Introducción

Los cuadros y el pegamento son dos conceptos clave que proporcionan la base del modelo y las capacidades de composición tipográfica de TeX. Basándonos en el material introductorio de una publicación anterior, [Cuadros 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), este artículo ampliamente ilustrado examina los cuadros y el pegamento con más detalle. También presentamos un nuevo proyecto de Overleaf basado en LuaTeX [proyecto de Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) que te permite explorar la estructura interna profunda de los cuadros de TeX—aportando ideas que te ayudarán a comprender realmente su comportamiento. La creación del proyecto de Overleaf se vio enormemente facilitada por el trabajo de Patrick Gundlach, así que le ofrecemos [nuestro agradecimiento](#credits-thanks-patrick).

## ¿Por qué elegir LuaTeX?

En primer lugar, conviene volver a establecer la diferencia entre LuaTeX y LuaLaTeX:

* LuaTeX es el nombre de un motor de composición tipográfica basado en TeX y ejecutable;
* LuaLaTeX se refiere al uso del paquete de macros LaTeX con el motor LuaTeX.

Esta distinción es extremadamente importante porque, en este artículo, estamos aprovechando las capacidades integradas del motor LuaTeX en sí, y no solo utilizando las características/funcionalidad de los comandos proporcionados por el paquete de macros LaTeX.

Los lectores que no estén seguros de la diferencia entre un motor TeX y el paquete de macros LaTeX quizá deseen leer uno de nuestros artículos publicados anteriormente, [¿Qué hay en un nombre?: una guía de las muchas variantes de TeX](/latex/es/articulos-en-profundidad/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md), que explica esas diferencias con algo de detalle. Ese mismo artículo también analiza “TeX” como lenguaje de programación y que los motores de composición tipográfica basados en TeX (p. ej., pdfTeX, XeTeX y LuaTeX) no solo varían en sus características y funcionalidad, sino que también tienen variaciones en el “sabor” del lenguaje TeX que admiten. Esto nos lleva a nuestra elección de LuaTeX. Además de soportar un lenguaje de programación basado en TeX, LuaTeX también tiene incrustado el lenguaje de scripting Lua, lo que proporciona acceso a un lenguaje de programación convencional simple, pero muy potente. A través de Lua y de la funcionalidad integrada de LuaTeX, puedes explorar y controlar las actividades de composición tipográfica de LuaTeX de maneras que ningún otro motor TeX proporciona—y esto incluye la capacidad de inspeccionar las estructuras internas de los cuadros de TeX; por ello, LuaTeX es la elección ideal (la única) para este artículo y el proyecto de Overleaf que lo acompaña.

### pdfTeX/XeTeX frente a LuaTeX: en imágenes

Las siguientes *esquemas* están destinadas a resaltar una comparación importante entre el diseño de pdfTeX/XeTeX y LuaTeX. Tanto pdfTeX como XeTeX permiten, por supuesto, a los usuarios escribir código TeX que puede influir en el comportamiento de la composición tipográfica; sin embargo, las estructuras internas más profundas contenidas en esos motores TeX, y los datos de bajo nivel construidos durante el proceso de composición tipográfica, son en su mayor parte inaccesibles para los comandos y macros del usuario. En ese sentido, son *relativamente* sistemas cerrados en comparación con LuaTeX.

#### pdfTeX/XeTeX

![{{{alt}}}](/files/ba8fd3441547bd47ae72ec0472f24e4980398b07)

#### LuaTeX

LuaTeX introduce un nuevo comando primitivo llamado `\directlua{...}` por medio del cual puedes escribir código que no solo da acceso completo al lenguaje Lua, sino que también te permite ampliar las capacidades de LuaTeX escribiendo complementos usando lenguajes como C y C++. En Windows, estos complementos se llaman *Bibliotecas de enlace dinámico* (.DLL); en Linux se conocen como *Bibliotecas de objetos compartidos* (.so). Sin embargo, el verdadero poder de LuaTeX se deriva de un enorme conjunto de funciones Lua integradas que proporcionan acceso a los entresijos de LuaTeX—permitiendo un control y una programación extremadamente sofisticados de la composición tipográfica basada en TeX. Un conjunto de tales funciones se conoce como una API (Interfaz de Programación de Aplicaciones) y es a través de la API de LuaTeX que utilizas programas Lua para comunicarte con su motor de composición tipográfica basado en TeX y sus estructuras de datos.

![{{{alt}}}](/files/c6f886c6c0e0a6e3696547956e9ec68a3d96728e)

Con el `\directlua{...}` comando puedes, por ejemplo, acceder a estructuras de datos internas de TeX de bajo nivel ocultas a la vista en otros motores TeX. Además, puedes usar scripts Lua para realizar todo tipo de cálculos de programación, manipulación de cadenas, etc., y devolver los resultados a TeX: las posibilidades son casi infinitas. Sin embargo, este artículo no pretende ser una exposición detallada ni un tutorial sobre LuaTeX—aunque es tentador dar ejemplos que transmitan la increíble versatilidad de este asombrosamente potente motor TeX.

## Cuadros y pegamento: un breve recordatorio

Como se introdujo en el artículo [Cuadros y pegamento: una breve, pero visual, introducción usando LuaTeX](https://www.overleaf.com/blog/511-boxes-and-glue-a-brief-but-visual-introduction-using-luatex) los cuadros y el pegamento son dos conceptos clave que sustentan las capacidades de composición tipográfica de TeX. El siguiente diagrama se ofrece como un breve recordatorio sobre el comportamiento de los tipos de cuadro horizontal y vertical de TeX. Nota: los cuadros horizontales pueden, por supuesto, contener texto compuesto en lenguas de derecha a izquierda, como árabe o hebreo, lo que significa que la dirección de crecimiento del cuadro puede ser la opuesta a la mostrada para el cuadro horizontal en el diagrama siguiente.

![{{{alt}}}](/files/5d65b9aa09c6b4e0d37e7c02b17f434bd0034c50)

### Primitivas de TeX para la construcción de cuadros

Hoy en día, la mayoría de las personas preparan sus documentos TeX utilizando el paquete de macros LaTeX, que está diseñado para proporcionar comandos que protegen a los usuarios de gran parte del lenguaje de bajo nivel de TeX—sus llamadas *primitivas*—los comandos básicos integrados en los motores TeX (véase el artículo [¿Qué hay en un nombre?: una guía de las muchas variantes de TeX](/latex/es/articulos-en-profundidad/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) para una discusión de las primitivas de TeX). La colección de macros LaTeX proporciona una variedad de macros para la creación y el almacenamiento (guardado) de cuadros, pero si eliminas todo el código de macros verás que solo hay 4 comandos primitivos de bajo nivel para la construcción de cuadros:

Para crear listas horizontales:

* \hbox{...}

Para crear y apilar listas verticales:

* \vbox{...}
* \vtop{...}
* \vcenter{...}

No explicaremos cómo usar todos estos comandos de cuadro porque hay muchos ejemplos y tutoriales en otros lugares de la web o en libros de TeX/LaTeX, pero sí vamos a ver cómo se representan y almacenan los cuadros dentro de las estructuras de datos de TeX.

### Pegamento: espaciado flexible

El pegamento es, en efecto, una forma de espaciado utilizada por TeX para espaciar/posicionar elementos horizontal o verticalmente. Como usuario de TeX, podemos indicar a TeX que inserte un poco de pegamento de tamaño fijo o podemos usar pegamento flexible, con toda la flexibilidad que necesitemos, ya sea para estirarse o encogerse según nuestros requisitos. Uno de los comandos de TeX para crear pegamento para espaciado horizontal se llama `\hskip` que toma la forma

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

`**plus**` y `**minus**` son palabras clave de TeX, pero no necesitas usarlas para cada pegamento. Si `**plus**` o `**minus**` están ausentes, entonces el correspondiente `<cantidad para estirar>` o `<cantidad para encoger>` se asume que es cero. Por ejemplo, `\hskip 3pt` inserta un pegamento de ancho fijo sin componente de estiramiento ni de encogimiento.

Por ahora, piensa en `<cantidad para estirar>` y `<cantidad para encoger>` como nuestras *recomendaciones* a TeX porque la cantidad exacta de estiramiento o encogimiento será calculada por TeX.

Para ayudar con estas ideas, aquí hay un diagrama que representa el pegamento como un resorte. El `<ancho natural>` es la longitud del resorte cuando no hay tensión (estiramiento) ni compresión (encogimiento). Los `<cantidad para estirar>` y `<cantidad para encoger>` se muestran en relación con la longitud natural del resorte.

![{{{alt}}}](/files/b25730072eb379d9fa2aa0c26ca82ade778759ec)

#### Un ejemplo de \hbox

Supongamos que queremos crear un `\hbox{...}` que contenga solo las letras A, B, C y D, y necesitamos que este cuadro tenga un ancho de 100pt (100 puntos TeX). Además, es seguro asumir que el ancho total de esos cuatro caracteres es mucho menor que 100pt, lo que indica que TeX necesita alguna forma de llenar el espacio restante dentro del cuadro: usaremos pegamento para hacerlo. Sin embargo, como no conocemos la cantidad exacta de pegamento necesaria para llenar el cuadro, es aconsejable añadir algunos pegamentos flexibles y dejar que TeX se encargue de calcular la cantidad de espacio que esos pegamentos deben ocupar. En el siguiente fragmento de código, observa el uso de “%” para suprimir los espacios entre palabras que surgen de los caracteres de fin de línea.

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

El cuadro resultante se ve así (ampliado para mayor claridad):

![{{{alt}}}](/files/198af170bfa1efba75c2f8cfb6307919ad2e1d7e)

Este `\hbox` se superpone con cuadros discontinuos (en rojo) para indicar el ancho de los caracteres (tal como TeX los ve). A efectos de composición tipográfica, los caracteres se consideran pequeños cuadros y la cantidad de pegamento necesaria para llenar este `\hbox`se determina (se calcula) teniendo en cuenta los anchos de cada carácter.

Resulta que TeX no estiró ni encogió el pegamento entre A y B (establecido en 4pt) y no hay pegamento entre B y C (establecido en 0pt). Sin embargo, el pegamento entre C y D y el pegamento entre D y el final del cuadro se han estirado considerablemente porque esos pegamentos tienen el componente de estiramiento más flexible; en efecto, esos pegamentos absorbieron todo el estiramiento requerido para llenar el cuadro.

## De vuelta a LuateX

Hasta ahora hemos explorado los cuadros y el pegamento y hemos visto que LuaTeX permite acceder a estructuras internas de TeX ocultas a la vista con pdfTeX y XeTeX. Es hora de un ejemplo para hacer esto más explícito, pero, en primer lugar, necesitamos familiarizarnos brevemente con la forma en que TeX almacena los cuadros en su memoria: empezaremos con una analogía.

### Cómo almacena TeX los cuadros en memoria: una analogía

Supongamos que, por algún motivo, necesitabas crear un modelo de datos que describiera un cuadro físico. ¿Qué datos podrías elegir para proporcionar tal descripción? Un enfoque que podrías adoptar es dividir la información en dos partes: datos sobre el cuadro físico en sí y datos que proporcionan una lista del contenido del cuadro. Así, nuestro modelo simple podría verse así:

1. Datos sobre el cuadro físico («metadatos»):

* width
* altura
* profundidad
* peso
* color
* tipo (de madera, plástico, cartón)

3. Datos sobre el contenido del cuadro: alguna forma de lista que describa los elementos que contiene—probablemente enumerados en ningún orden particular.

Y hay una analogía muy cercana con la forma en que TeX almacena los cuadros.

### Cómo almacena TeX los cuadros en memoria: hlists y vlists

Internamente, TeX crea «contenedores» llamados *hlists* (listas horizontales) y *vlists* (listas verticales), que representan hboxes y vboxes respectivamente. Estos objetos hlist/vlist proporcionan una colección de «metadatos» sobre el cuadro, además de proporcionar acceso a la lista de objetos que el cuadro contiene realmente; esa lista se llama *lista de nodos*. A diferencia de un cuadro físico, en el que puedes colocar objetos dentro en cualquier orden, para TeX el orden del contenido del cuadro es extremadamente importante: son elementos que se van a componer tipográficamente. Si tienes algún conocimiento de programación o informática, no te sorprenderá saber que los objetos dentro de un cuadro de TeX se almacenan, y se preserva su orden de creación, mediante una llamada [lista doblemente enlazada](https://en.wikipedia.org/wiki/Doubly_linked_list). No vamos a hablar de listas enlazadas con más detalle porque la web abunda en tutoriales, ejemplos y explicaciones.

El concepto de nodos y listas de nodos es un aspecto fundamental de cómo funciona TeX, pero a efectos de este artículo daremos solo un breve resumen. Los nodos son, en esencia, una especie de «mini contenedor» y (a partir de LuaTeX 1.04) existen unos 50 tipos diferentes de nodo, que reflejan los tipos de datos internos y los componentes que LuaTeX utiliza para la composición tipográfica. Por ejemplo, hay nodos para representar: glifos (que provienen de «caracteres»), pegamento, reglas horizontales/verticales, penalizaciones, «whatsits», kerns, etcétera. Todo el material compuesto tipográficamente acabará, con el tiempo, formando parte de una enorme lista de nodos y LuaTeX te da acceso directo a esas estructuras internas de datos. LuaTeX también te permite añadir, editar, modificar o crear listas de nodos, de modo que, por ejemplo, puedes crear cuadros directamente dentro del código Lua sin tener que usar ningún código TeX. Sin embargo, escribir sobre eso es asunto para otro día.

### Un ejemplo simple de \directlua{...} en acción

El siguiente ejemplo crea un `\hbox` y lo guarda en el registro de cuadros 0. Luego informamos del ancho del cuadro usando código TeX tradicional y obtenemos la misma información usando un segundo método a través de `\directlua{}`. Aquí ejecutamos un pequeño script Lua que accede al área interna de almacenamiento de cuadros de TeX para obtener el ancho del cuadro—por supuesto, los dos valores son idénticos: 2412092sp (sp=punto escalado: 65536sp = 1 punto TeX). En última instancia, en este ejemplo extremadamente simple, el código TeX y el código Lua examinan ambas las mismas estructuras internas de datos para obtener el ancho del cuadro, pero es a través de la vía de acceso directo que LuaTeX abre la puerta a una gran cantidad de información y control que no está disponible con otros motores.

![{{{alt}}}](/files/d43beff0bb847562d8edbec188608cf8a5ad57b1)

```latex
\documentclass{article}
\begin{document}
\setbox0=\hbox{A\hskip 5pt B\hskip 10pt C}
\fontsize{18}{22}\selectfont
\noindent Usando código \TeX{}, la caja 0 tiene un ancho de \number\wd0\relax \space sp\par
\noindent También podemos usar Lua y llamar a una de las funciones de Lua\TeX para obtener la misma
información.\vskip10mm
\noindent Desde código Lua, la caja 0 tiene un ancho
\directlua{
local boxwidth = tex.box[0].width
tex.print(boxwidth.." sp")
} que, por supuesto, es idéntico al valor obtenido con el código \TeX{}.
\end{document}
```

## Poniéndolo todo junto: un proyecto de Overleaf

Hemos señalado que, internamente, TeX representa los cuadros como «contenedores» llamados hlists/vlists, que almacenan «metadatos» sobre el cuadro y proporcionan acceso a la lista de componentes a partir de los cuales se construye el cuadro. Usando LuaTeX puedes acceder a los «metadatos» del cuadro y a la lista de elementos contenidos en un cuadro de TeX: glifos, pegamento, penalizaciones, otros cuadros, etcétera. Usando scripts Lua, es posible examinar un cuadro situado en la memoria de TeX y dibujar una representación detallada de lo que ese cuadro contiene. Una representación adecuada de un cuadro de TeX y su contenido se logra utilizando *grafos de nodos* y hemos preparado un [proyecto de Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) que hace eso aprovechando un excelente script Lua escrito por Patrick Gundlach (véase los créditos). No describiremos los procesos detallados necesarios para examinar cuadros y generar grafos de nodos—salvo para señalar que cualquier programa/script que procese cuadros de TeX tiene que ser *recursivo* porque los cuadros pueden anidarse: es decir, puedes tener hboxes dentro de vboxes, dentro de hboxes… combinando todos los tipos de cuadro a un nivel muy profundo de anidamiento.

![{{{alt}}}](/files/8811ed358f5a3f9efedae063731df73624cadbd9)

### ¿Qué proporciona el proyecto?

Implementa solo 1 comando llamado `\dobox{comando de cuadro}`, por ejemplo:

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

El `\dobox{...}` comando realiza varias tareas:

1. dentro de tu documento compone tipográficamente el código TeX literal de tu cuadro;
2. genera un gráfico SVG del cuadro de TeX—puedes incrustarlo en una página web (como hemos hecho dentro de esta entrada del blog);
3. genera un gráfico SVG de la lista de nodos—que también puedes incrustar en páginas web (como hemos hecho dentro de esta entrada del blog);
4. genera una gráfica PDF de la lista de nodos que luego se importa en el documento PDF principal producido por el proyecto.

Los grafos de nodos pueden volverse muy rápidamente extremadamente grandes debido a la enorme cantidad de datos que LuaTeX necesita almacenar para representar cuadros complejos de TeX—como la página que se está construyendo actualmente, o las matemáticas compuestas tipográficamente. Para listas de nodos más grandes, el gráfico PDF importado puede quedar recortado por el borde de página de tu documento—si quieres ver un grafo de nodos grande puedes descargar un archivo ZIP del proyecto y extraer el gráfico PDF de interés. Cuando descargues el archivo ZIP del proyecto, asegúrate de elegir “Input and Output Files” de la lista desplegable de opciones:

![{{{alt}}}](/files/0601dbbf8714a5a95331a79ffcfa3828d2235054)

### Gráficos del proyecto de Overleaf: una breve descripción

Antes de mostrar algunos ejemplos, conviene hacer algunas observaciones sobre los gráficos producidos por el proyecto de Overleaf—usaremos el mismo `\hbox` ejemplo mencionado antes en el artículo. Aquí aparece envuelto en el `\dobox{...}` comando:

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

Aquí está el `\hbox` producido por TeX—para mayor claridad, el cuadro se ha ampliado, pero el borde se incluye en los gráficos producidos por el proyecto de Overleaf.

![{{{alt}}}](/files/b29ff7076f7a74241716fad5399aab02e8380c73)

Aquí hay un *anotado* diagrama SVG de la lista de nodos que representa el cuadro anterior—se añadieron anotaciones para resaltar los «metadatos» del cuadro y la lista de objetos que contiene: esas anotaciones no están presentes en los gráficos producidos por el proyecto de Overleaf.

[![{{{alt}}}](/files/caddaf267e6ff861f002dd1c186c3d9013abff70)](https://www.filepicker.io/api/file/ZSwIylUR66eFYPMo0suX)

Si observas la sección de «metadatos», podrías notar algunos parámetros desconocidos:

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

Estos parámetros son los ajustes utilizados por TeX para calcular cuánto tiene que estirarse o encogerse el pegamento dentro de este cuadro y son solo un ejemplo de los datos que puedes obtener fácilmente a través de LuaTeX pero no con otros motores TeX. Ten en cuenta que los nodos de pegamento contenidos en los componentes del cuadro *conservan* los valores originales de pegamento que escribimos para crear el cuadro. Esto es esencial porque TeX proporciona los comandos `\unhbox`, `\unvbox`, `\unhcopy`, `\unvcopy` que «desencuadran» el contenido del cuadro y lo devuelven al flujo de entrada para que vuelvan a participar en las operaciones de composición tipográfica. Solo cuando TeX finalmente saca (envía) el cuadro a un archivo PDF o DVI es cuando `glue_set`, `glue_sign` y `glue_order` se aplican a los pegamentos contenidos en el cuadro—para calcular la cantidad real de estiramiento o encogimiento requerida para posicionar los componentes dentro del cuadro y luego generar los datos PDF o los opcodes DVI apropiados.

Otro parámetro listado en los «metadatos» es `shift`: este es el valor del desplazamiento del cuadro que resulta de aplicar los comandos de TeX:

* `\raise`, `\lower` (aplicados a un `\hbox`);
* `\moveleft`, `\moveright` (aplicados a un `\vbox`).

En nuestro ejemplo, `shift` es 0pt porque no desplazamos el `\hbox` de su posición natural.

El [proyecto de Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) también genera diagramas de grafos de nodos en formato PDF: aquí hay un enlace para descargar una [versión en archivo PDF](https://www.filepicker.io/api/file/bezigXESC2FSasvjoh8A) del grafo de nodos anterior.

### ¿Cómo crea el proyecto de Overleaf esos gráficos?

El proyecto de Overleaf aprovecha la capacidad de ejecutar herramientas de software y utilidades instaladas en los servidores de Overleaf—véase [esta entrada del blog](/latex/es/articulos-en-profundidad/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md) para más detalles y un proyecto de ejemplo. Para producir un gráfico SVG que represente un cuadro de TeX, el código TeX del cuadro se escribe en un archivo pequeño que luego se compone tipográficamente con pdfTeX para generar un archivo DVI—nótese que el programa pdfTeX es ejecutado por LuaTeX mediante el uso de unas pocas líneas de script Lua. Ese archivo DVI se convierte, sobre la marcha, a SVG usando la `dvisvgm` utilidad, que se distribuye con la distribución TeX Live instalada en los servidores de Overleaf. `dvisvgm` se ejecuta con la opción de línea de comandos `-n` para garantizar que cualquier texto compuesto se convierta en líneas/curvas, de modo que la representación correcta del archivo SVG no dependa de que las fuentes TeX estén instaladas.

Para crear los grafos de nodos usamos un script Lua llamado `hiviznodelist.lua` que se basa en el trabajo de Patrick Gundlach. Ese script escribe un archivo llamado `.gv` (Graphviz), que es un archivo de texto que contiene un grafo de nodos descrito en el `lenguaje dot` . El `.gv` archivo es procesado por un programa de utilidad llamado `lenguaje dot` que genera un diagrama de nodos en formatos de archivo PDF y SVG.

### Ejemplos del proyecto

Aquí hay algunos ejemplos adicionales con gráficos SVG producidos usando el proyecto de Overleaf. Los cuadros que contienen mucho texto (p. ej., en un \vbox), o matemáticas complejas, producirán grafos de nodos enormes: si exploras el proyecto de Overleaf, es aconsejable no usar cuadros innecesariamente complejos para demostrar las características que te interesan.

#### \vbox to 25pt{A}

Este ejemplo demuestra el efecto de poner texto directamente en un `\vbox`: observa que la estructura de nodos es bastante compleja, incluso para un cuadro tan simple. La razón de esta complejidad es que el texto colocado directamente en un `\vbox` hace que TeX realice la división de líneas. Puedes ver que el `\vbox` tiene un ancho de 345pt: el valor de `\hsize` en el momento en que se creó este cuadro. Observa también que el carácter “A” está contenido dentro de un `hlist` que también tiene un ancho de 345 puntos, y observa la gran penalización (10000) junto con `\parfillskip` y `\rightskip` pegamentos al final del contenido del cuadro. Esa penalización y los dos elementos de pegamento son insertados por las actividades de división de líneas de TeX. Si observas el `glue_set` valor de la línea del párrafo (`hlist`) que contiene la letra “A” verás que es extremadamente grande (322.500000): ¿por qué? Es porque la línea del párrafo tiene 345pt de ancho pero contiene solo un `\parindent` y la letra “A”: el espacio restante debe ser llenado por el `\parfillskip` pegamento, que tiene que estirarse una distancia considerable para llenar el espacio restante en la línea.

![{{{alt}}}](/files/b8942d156afc45789b5746829f6dfc59e3b31e44)

[![{{{alt}}}](/files/719c044f87494a5772f59db47fea39d3edd801c3)](https://www.filepicker.io/api/file/pVtHsNGSQ4m09vBZuOpQ)

[Descargar archivo PDF](https://www.filepicker.io/api/file/nBS0uDs2QjqKCKljAm7r)

#### \vbox to 25pt{\hbox{A}}

Es muy instructivo comparar este ejemplo con el anterior. Aquí, no solo el grafo de nodos es considerablemente más pequeño, sino que el ancho del `\vbox` es solo 7.50002pt: el mismo ancho que el carácter “A”. La razón es que la “A” se ha envuelto en un `\hbox` que impide que el `\vbox` desencadene a TeX a realizar la división de líneas—una característica importante de los cuadros creados con `\vbox`.

![{{{alt}}}](/files/374555401179a91dc0f52a40bdea46017ee3f5b8)

[![{{{alt}}}](/files/bc55b1f5972bdcd33e39542bd751261e4fbb0989)](https://www.filepicker.io/api/file/LHepknjnRGOVEdghW4qH)

[Descargar archivo PDF](https://www.filepicker.io/api/file/Yk3uCCQR5ao8Yd3TJCdE)

#### Matemáticas simples: \hbox{$$\displaystyle \int f(x) dx$$}, ¡un cuadro complejo!

Este ejemplo demuestra que incluso unas matemáticas compuestas muy simples crean una estructura de cuadro detallada: la composición tipográfica de matemáticas produce *extremadamente* ¡estructuras de datos complejas dentro de TeX!

![{{{alt}}}](/files/0aea37ad7500f3851baee369de1fa22cb99f7a4f)

[![{{{alt}}}](/files/26f788a8dc7435cf7aad138deeee7265b01b2d83)](https://www.filepicker.io/api/file/oVFNNvCqT0eZP0qS2odk)

[Descargar archivo PDF](https://www.filepicker.io/api/file/D5TepsdaSdeYZvkuSEJt)

## Créditos: ¡gracias, Patrick!

Nuestro agradecimiento a [Patrick Gundlach](https://twitter.com/patrickgundlach) quien ha concedido a Overleaf permiso para usar y distribuir una versión modificada de su script Lua, `viznodelist.lua`, que procesa cuadros de TeX y genera un archivo (en el `lenguaje dot` lenguaje) que puede procesarse para dibujar un grafo de nodos. El proyecto de Overleaf contiene un script Lua llamado `hiviznodelist.lua`—una versión renombrada y modificada del código original de Patrick, que está disponible en [GitHub](http://gist.github.com/556247). Patrick ha creado un sistema de composición tipográfica basado en LuaTeX de código abierto llamado [speedata Publisher](https://speedata.github.io/publisher/index.html) que puedes descargar y usar gratis; también hay opciones de soporte comercial disponibles.


---

# 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/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.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.
