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

# La \hbox de Pandore : utiliser LuaTeX pour lever le couvercle des boîtes TeX

## Introduction

Les boîtes et la colle sont deux concepts clés qui constituent le fondement du modèle de composition et des capacités de TeX. En nous appuyant sur le matériel introductif d’un précédent article, [Boîtes et colle : une brève introduction, mais visuelle, à l’aide de LuaTeX](/latex/fr/articles-approfondis/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md), cet article abondamment illustré examine les boîtes et la colle plus en détail. Nous présentons également un nouveau [projet Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) qui vous permet d’explorer la structure interne profonde des boîtes TeX — fournissant des éclairages qui vous aideront à vraiment comprendre leur comportement. La création du projet Overleaf a été grandement facilitée par le travail de Patrick Gundlach, aussi lui adressons-nous [nos remerciements](#credits-thanks-patrick).

## Pourquoi choisir LuaTeX ?

Tout d’abord, il vaut la peine de rappeler la différence entre LuaTeX et LuaLaTeX :

* LuaTeX est le nom d’un moteur de composition basé sur TeX ;
* LuaLaTeX désigne l’utilisation du paquet de macros LaTeX avec le moteur LuaTeX.

Cette distinction est extrêmement importante car, dans cet article, nous exploitons les capacités intégrées du moteur LuaTeX lui-même, et pas seulement les fonctionnalités des commandes fournies par le paquet de macros LaTeX.

Les lecteurs qui ne sont pas certains de la différence entre un moteur TeX et le paquet de macros LaTeX voudront peut-être lire l’un de nos articles déjà publiés, [Qu'y a-t-il dans un nom : un guide des nombreuses saveurs de TeX](/latex/fr/articles-approfondis/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md), qui explique ces différences en détail. Ce même article aborde également « TeX » en tant que langage de programmation et le fait que les moteurs de composition basés sur TeX (par ex. pdfTeX, XeTeX et LuaTeX) varient non seulement par leurs caractéristiques et fonctionnalités, mais aussi par la « saveur » du langage TeX qu’ils prennent en charge. Cela nous amène à notre choix de LuaTeX. En plus de prendre en charge un langage de programmation basé sur TeX, LuaTeX intègre également le langage de script Lua — offrant ainsi l’accès à un langage de programmation conventionnel simple, mais très puissant. Grâce à Lua, et aux fonctionnalités intégrées de LuaTeX, vous pouvez explorer et contrôler les activités de composition de LuaTeX d’une manière qu’aucun autre moteur TeX ne permet — y compris la capacité d’examiner les structures internes des boîtes TeX ; ainsi LuaTeX est le choix idéal (le seul) pour cet article et le projet Overleaf qui l’accompagne.

### pdfTeX/XeTeX contre LuaTeX : en images

Les *schémas* suivants visent à mettre en évidence une comparaison importante entre la conception de pdfTeX/XeTeX et celle de LuaTeX. pdfTeX et XeTeX permettent, bien sûr, aux utilisateurs d’écrire du code TeX qui peut influencer le comportement de la composition ; cependant, les structures internes plus profondes contenues dans ces moteurs TeX, ainsi que les données de bas niveau construites pendant le processus de composition, sont pour l’essentiel inaccessibles aux commandes et macros utilisateur. En ce sens, ce sont *des systèmes relativement* fermés par rapport à LuaTeX.

#### pdfTeX/XeTeX

![{{{alt}}}](/files/635226485ad8ee68506dc03b2ba2352aeca7ebd3)

#### LuaTeX

LuaTeX introduit une nouvelle commande primitive appelée `\directlua{...}` grâce à laquelle vous pouvez écrire du code qui donne non seulement un accès complet au langage Lua, mais permet aussi d’étendre les capacités de LuaTeX en écrivant des plug-ins dans des langages tels que C et C++. Sous Windows, ces plug-ins sont appelés *Bibliothèques de liens dynamiques* (.DLL) ; sous Linux, ils sont connus sous le nom de *Bibliothèques d’objets partagés* (.so). Cependant, la véritable puissance de LuaTeX provient d’un vaste ensemble de fonctions Lua intégrées qui donnent accès aux entrailles de LuaTeX — permettant un contrôle et une programmation extrêmement sophistiqués de la composition basée sur TeX. Un ensemble de telles fonctions est appelé une API (Application Programming Interface), et c’est par l’API de LuaTeX que vous utilisez des programmes Lua pour communiquer avec son moteur de composition basé sur TeX et ses structures de données.

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

Avec la `\directlua{...}` commande, par exemple, accéder à des structures de données internes de bas niveau de TeX cachées dans d’autres moteurs TeX. De plus, vous pouvez utiliser des scripts Lua pour effectuer toutes sortes de calculs de programmation, de manipulation de chaînes, etc., puis renvoyer les résultats à TeX : les possibilités sont presque infinies. Cependant, cet article n’a pas pour but d’être une exposition détaillée ou un tutoriel sur LuaTeX — même s’il est tentant de donner des exemples qui montrent l’incroyable polyvalence de cet étonnant moteur TeX très puissant.

## Boîtes et colle : un bref rappel

Comme présenté dans l’article [Boîtes et colle : une brève introduction, mais visuelle, à l’aide de LuaTeX](https://www.overleaf.com/blog/511-boxes-and-glue-a-brief-but-visual-introduction-using-luatex) les boîtes et la colle sont deux concepts clés qui sous-tendent les capacités de composition de TeX. Le schéma suivant est proposé comme un très bref aide-mémoire sur le comportement des types de boîtes horizontales et verticales de TeX. Remarque : les boîtes horizontales peuvent, bien sûr, contenir du texte composé dans des langues écrites de droite à gauche, comme l’arabe ou l’hébreu, ce qui signifie que la direction de croissance de la boîte peut être opposée à celle montrée pour la boîte horizontale dans le schéma ci-dessous.

![{{{alt}}}](/files/62e864e4b719b52e551e44b56857a9ff53c9d96b)

### Primitives TeX pour la construction de boîtes

Aujourd’hui, la plupart des gens préparent leurs documents TeX à l’aide du paquet de macros LaTeX, conçu pour fournir des commandes qui protègent les utilisateurs d’une grande partie du langage de bas niveau de TeX — ses soi-disant *primitives*— les commandes de base intégrées aux moteurs TeX (voir l’article [Qu'y a-t-il dans un nom : un guide des nombreuses saveurs de TeX](/latex/fr/articles-approfondis/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) pour une discussion des primitives TeX). La collection de macros LaTeX fournit विविधes macros pour la création et le stockage (sauvegarde) de boîtes, mais si vous retirez tout le code de macros, vous verrez qu’il n’existe que 4 commandes primitives de bas niveau pour construire des boîtes :

Pour créer des listes horizontales :

* \hbox{...}

Pour créer et empiler des listes verticales :

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

Nous n’expliquerons pas comment utiliser toutes ces commandes de boîtes car il existe de nombreux exemples et tutoriels ailleurs sur le web ou dans des livres sur TeX/LaTeX — mais nous allons examiner la manière dont les boîtes sont représentées et stockées à l’intérieur des structures de données de TeX.

### Colle : espacement flexible

La colle est, en effet, une forme d’espacement utilisée par TeX pour espacer/positionner des éléments horizontalement ou verticalement. En tant qu’utilisateur de TeX, nous pouvons demander à TeX d’insérer une colle de taille fixe ou utiliser une colle flexible — avec autant de souplesse que nécessaire, soit pour s’étirer soit pour se rétracter selon nos besoins. L’une des commandes de TeX pour créer de la colle pour l’espacement horizontal s’appelle `\hskip` qui prend la forme

`**\hskip** <largeur naturelle> **plus** <quantité d’étirement> **moins** <quantité de rétractation>`

`**plus**` et `**moins**` sont des mots-clés TeX, mais vous n’avez pas besoin de les utiliser pour chaque colle. Si `**plus**` ou `**moins**` sont absents, alors `<quantité d’étirement>` ou `<quantité de rétractation>` correspondante est supposée être nulle. Par exemple, `\hskip 3pt` insère une colle de largeur fixe sans composante d’étirement ni de rétractation.

Pour l’instant, pensez à `<quantité d’étirement>` et `<quantité de rétractation>` comme à nos *recommandations* à TeX, car la quantité exacte d’étirement ou de rétrécissement sera calculée par TeX.

Pour aider à comprendre ces idées, voici un schéma qui représente la colle sous forme de ressort. La `<largeur naturelle>` est la longueur du ressort lorsqu’il n’y a ni tension (étirement) ni compression (rétrécissement). Les `<quantité d’étirement>` et `<quantité de rétractation>` sont indiquées par rapport à la longueur naturelle du ressort.

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

#### Un exemple de \hbox

Supposons que nous voulions créer un `\hbox{...}` contenant simplement les lettres A, B, C et D et que nous ayons besoin que cette boîte fasse 100pt (100 points TeX) de large. De plus, on peut supposer sans risque que la largeur totale de ces quatre caractères est bien inférieure à 100pt, ce qui indique que TeX a besoin d’un moyen de remplir l’espace restant dans la boîte : nous utiliserons de la colle pour cela. Cependant, comme nous ne connaissons pas la quantité exacte de colle requise pour remplir la boîte, il est conseillé d’ajouter des colles flexibles et de laisser TeX se charger de calculer la quantité d’espace que ces colles doivent occuper. Dans l’extrait de code suivant, notez l’utilisation de « % » pour supprimer les espaces inter-mots résultant des caractères de fin de ligne.

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

La boîte obtenue ressemble à ceci (agrandie pour plus de clarté) :

![{{{alt}}}](/files/9871d483f67b494768c84314f1855589106597db)

Ce `\\hbox` est superposé à des cadres en pointillés (en rouge) pour indiquer la largeur des caractères (tels que TeX les voit). À des fins de composition, les caractères sont considérés comme de petites boîtes et la quantité de colle nécessaire pour remplir cette `\\hbox`est déterminée (calculée) en tenant compte des largeurs de chaque caractère.

Il s’avère que TeX n’a pas étiré ni rétréci la colle entre A et B (réglée à 4pt) et qu’il n’y a pas de colle entre B et C (réglée à 0pt). En revanche, la colle entre C et D et la colle entre D et la fin de la boîte se sont toutes deux considérablement étirées, car ces colles ont la composante d’étirement la plus souple — en effet, elles ont absorbé tout l’étirement nécessaire pour remplir la boîte.

## Retour à LuaTeX

Jusqu’à présent, nous avons exploré les boîtes et la colle et vu que LuaTeX permet d’accéder à des structures internes de TeX cachées à la vue dans pdfTeX et XeTeX. Il est temps d’avoir un exemple pour rendre cela plus explicite, mais, d’abord, nous devons nous familiariser brièvement avec la façon dont TeX stocke les boîtes dans sa mémoire — commençons par une analogie.

### Comment TeX stocke les boîtes en mémoire : une analogie

Supposons, pour une raison quelconque, que vous deviez créer un modèle de données décrivant une boîte physique. Quelles données choisiriez-vous pour fournir une telle description ? Une approche possible consiste à séparer les informations en deux parties : les données sur la boîte physique elle-même et les données qui fournissent une liste du contenu de la boîte. Notre modèle simple pourrait donc ressembler à ceci :

1. Données sur la boîte physique (« métadonnées ») :

* width
* hauteur
* profondeur
* poids
* couleur
* type (en bois, en plastique, en carton)

3. Données sur le contenu de la boîte : une forme de liste qui décrit les éléments qu’elle contient — probablement listés dans un ordre quelconque.

Et il existe une analogie très étroite avec la manière dont TeX stocke les boîtes.

### Comment TeX stocke les boîtes en mémoire : hlists et vlists

En interne, TeX crée des « conteneurs » appelés *hlists* (listes horizontales) et *vlists* (listes verticales) qui représentent respectivement les hboxes et les vboxes. Ces objets hlist/vlist fournissent un ensemble de « métadonnées » sur la boîte, ainsi qu’un accès à la liste des objets que la boîte contient réellement — cette liste est appelée une *liste de nœuds*. Contrairement à une boîte physique, dans laquelle vous pouvez placer des objets à l’intérieur dans n’importe quel ordre, pour TeX l’ordre du contenu de la boîte est extrêmement important — ce sont des éléments à composer. Si vous avez des bases en programmation ou en informatique, vous ne serez pas surpris d’apprendre que les objets d’une boîte TeX sont stockés, et que leur ordre de création est conservé, au moyen d’une soi-disant [liste doublement chaînée](https://en.wikipedia.org/wiki/Doubly_linked_list). Nous n’aborderons pas plus en détail les listes chaînées, car le web regorge de tutoriels, d’exemples et d’explications.

Le concept de nœuds et de listes de nœuds est un aspect fondamental du fonctionnement de TeX, mais, pour les besoins de cet article, nous n’en donnerons qu’un bref aperçu. Les nœuds sont, en substance, une sorte de « mini-conteneur » et (à partir de LuaTeX 1.04) il existe une cinquantaine de types de nœuds différents : ils reflètent les types de données et les composants internes que LuaTeX utilise pour la composition. Par exemple, il existe des nœuds pour représenter : des glyphes (issus des « caractères »), de la colle, des règles horizontales/verticales, des pénalités, des « whatsits », des kerns, etc. Tout le matériel composé finira, à terme, par devenir partie intégrante d’une énorme liste de nœuds, et LuaTeX vous donne un accès direct à ces structures de données internes. LuaTeX vous permet aussi d’ajouter, de modifier, de corriger ou de créer des listes de nœuds, de sorte que, par exemple, vous pouvez créer des boîtes directement dans du code Lua sans avoir à utiliser du code TeX du tout. Cependant, écrire à ce sujet est pour un autre jour.

### Un exemple simple de \directlua{...} en action

L’exemple suivant crée un `\\hbox` et l’enregistre dans le registre de boîte 0. Nous indiquons ensuite la largeur de la boîte à l’aide du code TeX traditionnel et obtenons la même information par une deuxième méthode via `\directlua{}`. Ici, nous exécutons un petit script Lua qui accède à la zone de stockage interne des boîtes de TeX pour obtenir la largeur de la boîte — bien sûr, les deux valeurs sont identiques : 2412092sp (sp = point échelonné : 65536sp = 1 point TeX). En fin de compte, dans cet exemple extrêmement simple, le code TeX et le code Lua examinent tous deux les mêmes structures de données internes pour obtenir la largeur de la boîte, mais c’est par l’accès direct que LuaTeX ouvre la porte à une richesse d’informations et de contrôle qui n’est pas disponible avec les autres moteurs.

![{{{alt}}}](/files/105f7af5321b244700f41f78670e90afc6f0ac0a)

```latex
\documentclass{article}
\begin{document}
\setbox0=\hbox{A\hskip 5pt B\hskip 10pt C}
\fontsize{18}{22}\selectfont
\noindent En utilisant du code \TeX{}, la boîte 0 a une largeur de \number\wd0\relax \space sp\par
\noindent Nous pouvons aussi utiliser Lua et appeler l’une des fonctions de Lua\TeX pour obtenir la même
information.\vskip10mm
\noindent Depuis le code Lua, la boîte 0 a une largeur de
\directlua{
local boxwidth = tex.box[0].width
tex.print(boxwidth.." sp")
} qui, bien sûr, est identique à la valeur obtenue avec le code \TeX{}.
\end{document}
```

## Tout regrouper : un projet Overleaf

Nous avons noté qu’en interne, TeX représente les boîtes comme des « conteneurs » appelés hlists/vlists qui stockent des « métadonnées » sur la boîte et donnent accès à la liste des composants à partir desquels la boîte est construite. Avec LuaTeX, vous pouvez accéder aux « métadonnées » de la boîte et à la liste des éléments contenus dans une boîte TeX : glyphes, colle, pénalités, autres boîtes, etc. À l’aide de scripts Lua, il est possible d’examiner une boîte située dans la mémoire de TeX et de tracer une représentation détaillée de ce qu’elle contient. Une représentation adaptée d’une boîte TeX et de son contenu est obtenue en utilisant *des graphes de nœuds* et nous avons préparé un [projet Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) qui fait cela en s’appuyant sur un excellent script Lua écrit par Patrick Gundlach (voir les crédits). Nous n’allons pas décrire les processus détaillés nécessaires pour examiner les boîtes et générer des graphes de nœuds — sauf pour noter que tout programme/script qui traite des boîtes TeX doit être *récursif* car les boîtes peuvent être imbriquées : c’est-à-dire que vous pouvez avoir des hboxes dans des vboxes, dans des hboxes… en combinant tous les types de boîtes à un niveau d’imbrication très profond.

![{{{alt}}}](/files/119a29ce2b0633dc0a0c490419f54010c02230e4)

### Que fournit le projet ?

Il implémente seulement 1 commande appelée `\dobox{commande de boîte}`, par exemple :

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

Le `\dobox{...}` commande effectue un certain nombre de tâches :

1. dans votre document, elle compose le code TeX brut de votre boîte ;
2. elle génère un graphique SVG de la boîte TeX — vous pouvez l’intégrer dans une page web (comme nous l’avons fait dans cet article de blog) ;
3. elle génère un graphique SVG de la liste de nœuds — que vous pouvez également intégrer dans des pages web (comme nous l’avons fait dans cet article de blog) ;
4. elle produit un graphique PDF de la liste de nœuds, qui est ensuite importé dans le document PDF principal produit par le projet.

Les graphes de nœuds peuvent devenir extrêmement grands très rapidement en raison de l’énorme quantité de données que LuaTeX doit stocker afin de représenter des boîtes TeX complexes — comme la page en cours de construction, ou des mathématiques composées. Pour les listes de nœuds plus grandes, le graphique PDF importé peut être rogné par la limite de page de votre document — si vous voulez afficher un grand graphe de nœuds, vous pouvez télécharger un fichier ZIP du projet et extraire le graphique PDF qui vous intéresse. Lorsque vous téléchargez le fichier ZIP du projet, veillez à choisir « Fichiers d’entrée et de sortie » dans la liste déroulante :

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

### Graphiques du projet Overleaf : brève description

Avant de montrer quelques exemples, il vaut la peine de faire quelques observations sur les graphiques produits par le projet Overleaf — nous utiliserons le même `\\hbox` exemple mentionné plus tôt dans l’article. Le voici intégré dans `\dobox{...}` commande :

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

Voici le `\\hbox` graphique produit par TeX — pour plus de clarté, la boîte a été agrandie, mais la bordure est incluse dans les graphiques produits par le projet Overleaf.

![{{{alt}}}](/files/4c1ffe3db4d228a44d31ed2fa5574fc5088bc55f)

Voici un *annoté* diagramme SVG de la liste de nœuds représentant la boîte ci-dessus — des annotations ont été ajoutées pour mettre en évidence les « métadonnées » de la boîte et la liste des objets qu’elle contient : ces annotations ne sont pas présentes dans les graphiques produits par le projet Overleaf.

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

Si vous regardez la section « métadonnées », vous remarquerez peut-être quelques paramètres peu familiers :

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

Ces paramètres sont les réglages utilisés par TeX pour calculer de combien la colle doit s’étirer ou se rétrécir dans cette boîte et ne constituent qu’un exemple de données que vous pouvez facilement obtenir via LuaTeX mais pas avec d’autres moteurs TeX. Notez que les nœuds de colle contenus dans les composants de la boîte *conservent* les valeurs originales de colle que nous avons saisies pour créer la boîte. C’est essentiel car TeX fournit les commandes `\unhbox`, `\unvbox`, `\unhcopy`, `\unvcopy` qui « déboîtent » le contenu de la boîte et le réinjectent dans le flux d’entrée pour reprendre une fois encore part aux opérations de composition. Ce n’est que lorsque TeX sort enfin (expédie) la boîte vers un fichier PDF ou DVI que `glue_set`, `glue_sign` et `glue_order` sont appliqués à toutes les colles contenues dans la boîte — afin de calculer la quantité réelle d’étirement ou de rétrécissement nécessaire pour positionner les composants dans la boîte, puis de générer les données PDF ou les opcodes DVI appropriés.

Un autre paramètre indiqué dans les « métadonnées » est `shift`: c’est la valeur du déplacement de la boîte résultant de l’application des commandes TeX :

* `\raise`, `\lower` (appliquées à un `\\hbox`);
* `\moveleft`, `\moveright` (appliquées à un `\\vbox`).

Dans notre exemple, `shift` vaut 0pt parce que nous n’avons pas déplacé le `\\hbox` de sa position naturelle.

Le [projet Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) produit aussi des diagrammes de graphes de nœuds au format PDF : voici un lien pour télécharger une [version de fichier PDF](https://www.filepicker.io/api/file/bezigXESC2FSasvjoh8A) du graphe de nœuds ci-dessus.

### Comment le projet Overleaf crée-t-il ces graphiques ?

Le projet Overleaf tire parti de la possibilité d’exécuter des outils et utilitaires logiciels installés sur les serveurs d’Overleaf — voir [cet article de blog](/latex/fr/articles-approfondis/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md) pour plus de détails et un exemple de projet. Pour produire un graphique SVG représentant une boîte TeX, le code TeX de la boîte est écrit dans un petit fichier qui est ensuite composé avec pdfTeX pour générer un fichier DVI — notez que le programme pdfTeX est exécuté par LuaTeX au moyen de quelques lignes de script Lua. Ce fichier DVI est converti à la volée en SVG à l’aide de l’ `dvisvgm` utilitaire — qui est fourni avec la distribution TeX Live installée sur les serveurs d’Overleaf. `dvisvgm` est exécuté avec l’option de ligne de commande `-n` pour garantir que tout texte composé soit converti en lignes/courbes afin que le rendu correct du fichier SVG ne dépende pas de l’installation de polices TeX.

Pour créer les graphes de nœuds, nous utilisons un script Lua appelé `hiviznodelist.lua` qui est basé sur le travail de Patrick Gundlach. Ce script écrit un fichier dit `.gv` (Graphviz), qui est un fichier texte contenant un graphe de nœuds décrit dans le langage `dot` . Le `.gv` fichier est traité par un programme utilitaire appelé `dot` qui produit un diagramme de nœuds aux formats de fichier PDF et SVG.

### Exemples de projet

Voici quelques exemples supplémentaires avec des graphiques SVG produits à l’aide du projet Overleaf. Les boîtes contenant beaucoup de texte (par ex. dans un \vbox), ou des mathématiques complexes, produiront d’énormes graphes de nœuds — si vous explorez le projet Overleaf, il est conseillé de ne pas utiliser des boîtes inutilement complexes pour démontrer les fonctionnalités qui vous intéressent.

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

Cet exemple montre l’effet de placer du texte directement dans une `\\vbox`: notez que la structure de nœuds est assez complexe, même pour une boîte aussi simple. La raison de cette complexité est que le texte placé directement dans une `\\vbox` amène TeX à effectuer la césure. Vous pouvez voir que le `\\vbox` a une largeur de 345pt : la valeur de `\hsize` au moment où cette boîte a été créée. Notez également que le caractère « A » est contenu dans un `hlist` qui a également une largeur de 345 points, et observez la grande pénalité (10000) ainsi que `\parfillskip` et `\rightskip` les colles à la fin du contenu de la boîte. Cette pénalité et les deux éléments de colle sont insérés par les activités de césure de TeX. Si vous regardez la `glue_set` valeur de la ligne de paragraphe (`hlist`) contenant la lettre « A », vous verrez qu’elle est extrêmement grande (322.500000) : pourquoi ? C’est parce que la ligne de paragraphe fait 345pt de large mais ne contient qu’un `\parindent` et la lettre « A » : l’espace restant doit être rempli par la `\parfillskip` colle, qui doit s’étirer considérablement pour remplir l’espace restant sur la ligne.

![{{{alt}}}](/files/13d0926592cebf711f84df66b1782773f40a6a96)

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

[Télécharger le fichier PDF](https://www.filepicker.io/api/file/nBS0uDs2QjqKCKljAm7r)

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

Il est très instructif de comparer cet exemple au précédent. Ici, non seulement le graphe de nœuds est considérablement plus petit, mais la largeur du `\\vbox` n’est que de 7.50002pt : la même largeur que le caractère « A ». La raison est que le « A » a été enveloppé dans un `\\hbox` qui empêche le `\\vbox` de déclencher la césure de TeX — une caractéristique importante des boîtes créées avec `\\vbox`.

![{{{alt}}}](/files/8322dd68ee3c6a6c969b0b5c291cac86d793516f)

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

[Télécharger le fichier PDF](https://www.filepicker.io/api/file/Yk3uCCQR5ao8Yd3TJCdE)

#### Maths simples : \hbox{$$\displaystyle \int f(x) dx$$}, boîte complexe !

Cet exemple montre que même des mathématiques composées très simples créent une structure de boîte détaillée : la composition mathématique produit *extrêmement* des structures de données complexes à l’intérieur de TeX !

![{{{alt}}}](/files/928d543fbf42844a21c99abe760435e71f8531ce)

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

[Télécharger le fichier PDF](https://www.filepicker.io/api/file/D5TepsdaSdeYZvkuSEJt)

## Crédits : merci Patrick !

Nos remerciements à [Patrick Gundlach](https://twitter.com/patrickgundlach) qui a donné à Overleaf l’autorisation d’utiliser et de distribuer une version modifiée de son script Lua, `viznodelist.lua`, qui traite des boîtes TeX et produit un fichier (dans le `dot` langage) pouvant être traité pour dessiner un graphe de nœuds. Le projet Overleaf contient un script Lua appelé `hiviznodelist.lua`— une version renommée et modifiée du code original de Patrick, qui est disponible sur [Github](http://gist.github.com/556247). Patrick a créé un système de composition open source basé sur LuaTeX appelé [speedata Publisher](https://speedata.github.io/publisher/index.html) que vous pouvez télécharger et utiliser gratuitement — des options de support commercial sont également 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/fr/articles-approfondis/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.
