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

# Pandoras \hbox: Mit LuaTeX den Deckel von TeX-Boxen anheben

## Einführung

Boxen und Glue sind zwei Schlüsselkonzepte, die die Grundlage für TeXs Satzmodell und -möglichkeiten bilden. Aufbauend auf dem einführenden Material in einem früheren Beitrag, [Boxen und Glue: Eine kurze, aber visuelle Einführung mit LuaTeX](/latex/de/ausfuhrliche-artikel/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md), untersucht dieser reich bebilderte Artikel Boxen und Glue ausführlicher. Wir stellen außerdem ein neues auf LuaTeX basierendes [Overleaf-Projekt](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) vor, das es Ihnen ermöglicht, die tiefe innere Struktur von TeX-Boxen zu erkunden — und Einblicke zu gewinnen, die Ihnen helfen werden, ihr Verhalten wirklich zu verstehen. Die Erstellung des Overleaf-Projekts wurde durch die Arbeit von Patrick Gundlach sehr erleichtert, daher danken wir [ihm herzlich](#credits-thanks-patrick).

## Warum LuaTeX wählen?

Zunächst lohnt es sich, den Unterschied zwischen LuaTeX und LuaLaTeX noch einmal zu betonen:

* LuaTeX ist der Name einer ausführbaren, auf TeX basierenden Satz-Engine;
* LuaLaTeX bezeichnet die Verwendung des LaTeX-Makropakets mit der LuaTeX-Engine.

Diese Unterscheidung ist äußerst wichtig, denn in diesem Artikel nutzen wir die eingebauten Fähigkeiten der LuaTeX-Engine selbst und nicht nur die Funktionen/den Funktionsumfang der vom LaTeX-Makropaket bereitgestellten Befehle.

Leser, die sich über den Unterschied zwischen einer TeX-Engine und dem LaTeX-Makropaket nicht im Klaren sind, möchten vielleicht einen unserer früher veröffentlichten Artikel lesen, [Was steckt in einem Namen: Ein Leitfaden zu den vielen Varianten von TeX](/latex/de/ausfuhrliche-artikel/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md), der diese Unterschiede etwas ausführlicher erläutert. Derselbe Artikel behandelt auch „TeX“ als Programmiersprache und dass TeX-basierte Satz-Engines (z. B. pdfTeX, XeTeX und LuaTeX) nicht nur in ihren Funktionen und ihrer Funktionalität variieren, sondern auch Variationen im „Flavor“ der von ihnen unterstützten TeX-Sprache aufweisen. Das führt uns zu unserer Wahl von LuaTeX. Zusätzlich zur Unterstützung einer auf TeX basierenden Programmiersprache ist in LuaTeX auch die Skriptsprache Lua eingebettet — sie bietet Zugriff auf eine einfache, aber sehr leistungsfähige herkömmliche Programmiersprache. Über Lua und die eingebauten Funktionen von LuaTeX können Sie die Satzvorgänge von LuaTeX auf eine Weise untersuchen und steuern, die keine andere TeX-Engine bietet — und dazu gehört auch die Möglichkeit, die inneren Strukturen von TeX-Boxen zu untersuchen; daher ist LuaTeX die ideale (einzige) Wahl für diesen Artikel und das dazugehörige Overleaf-Projekt.

### pdfTeX/XeTeX vs. LuaTeX: in Bildern

Die folgenden *Schemata* sollen einen wichtigen Vergleich zwischen dem Design von pdfTeX/XeTeX und LuaTeX hervorheben. Sowohl pdfTeX als auch XeTeX erlauben es den Benutzern natürlich, TeX-Code zu schreiben, der das Satzverhalten beeinflussen kann; jedoch sind die tieferen internen Strukturen, die in diesen TeX-Engines enthalten sind, sowie die während des Satzprozesses erzeugten Low-Level-Daten für Benutzerbefehle und Makros größtenteils unzugänglich. In diesem Sinne sind sie *vergleichsweise* geschlossene Systeme im Vergleich zu LuaTeX.

#### pdfTeX/XeTeX

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

#### LuaTeX

LuaTeX führt einen neuen Primitivbefehl namens `\directlua{...}` ein, mit dem Sie Code schreiben können, der nicht nur vollen Zugriff auf die Lua-Sprache bietet, sondern es Ihnen auch erlaubt, die Fähigkeiten von LuaTeX durch das Schreiben von Plug-ins in Sprachen wie C und C++ zu erweitern. Unter Windows werden solche Plug-ins als *Dynamic Link Libraries* (.DLL) bezeichnet; unter Linux sind sie als *Shared Object Libraries* (.so) bekannt. Die eigentliche Stärke von LuaTeX resultiert jedoch aus einer riesigen Menge eingebauter Lua-Funktionen, die Zugriff auf die Interna von LuaTeX bieten — und damit eine äußerst ausgefeilte Steuerung und Programmierung des TeX-basierten Satzes ermöglichen. Eine solche Funktionssammlung nennt man API (Application Programming Interface), und über die API von LuaTeX verwenden Sie Lua-Programme, um mit seiner TeX-basierten Satz-Engine und seinen Datenstrukturen zu kommunizieren.

![{{{alt}}}](/files/2ffdd26ec0def009cec44954635a7709aaa0d594)

Mit LuaTeXs `\directlua{...}` Befehl können Sie beispielsweise auf niedrigstufige interne TeX-Datenstrukturen zugreifen, die in anderen TeX-Engines verborgen sind. Außerdem können Sie Lua-Skripte verwenden, um alle möglichen Programmierberechnungen, Zeichenkettenmanipulationen usw. durchzuführen und die Ergebnisse an TeX zurückzugeben: Die Möglichkeiten sind nahezu endlos. Dieser Artikel soll jedoch keine ausführliche Darstellung oder ein Tutorial zu LuaTeX sein — auch wenn es verlockend ist, Beispiele zu geben, die die unglaubliche Vielseitigkeit dieser erstaunlich leistungsfähigen TeX-Engine vermitteln.

## Boxen und Glue: Eine kurze Erinnerung

Wie im Artikel [Boxen und Glue: Eine kurze, aber visuelle Einführung mit LuaTeX](https://www.overleaf.com/blog/511-boxes-and-glue-a-brief-but-visual-introduction-using-luatex) einführend dargestellt, sind Boxen und Glue zwei Schlüsselkonzepte, die TeXs Satzmöglichkeiten untermauern. Das folgende Diagramm dient als sehr kurze Gedächtnisstütze zum Verhalten von TeXs horizontalen und vertikalen Box-Typen. Hinweis: Horizontale Boxen können natürlich auch Text enthalten, der in von rechts nach links geschriebenen Sprachen wie Arabisch oder Hebräisch gesetzt ist; das bedeutet, dass die Wachstumsrichtung der Box der im untenstehenden Diagramm für die horizontale Box gezeigten entgegengesetzt sein kann.

![{{{alt}}}](/files/08ba1bc4cd6ecc9e5a4dc0d58517e4b252ffa44e)

### TeX-Primitiven zum Erzeugen von Boxen

Heute bereiten die meisten Menschen ihre TeX-Dokumente mit dem LaTeX-Makropaket vor, das dazu dient, Befehle bereitzustellen, die die Benutzer von einem Großteil von TeXs Low-Level-Sprache abschirmen — den sogenannten *Primitiven*— den in TeX-Engines eingebauten Kernbefehlen (siehe den Artikel [Was steckt in einem Namen: Ein Leitfaden zu den vielen Varianten von TeX](/latex/de/ausfuhrliche-artikel/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) für eine Diskussion der TeX-Primitiven). Die LaTeX-Makrosammlung bietet eine Vielzahl von Makros zum Erzeugen und Speichern (Sichern) von Boxen, aber wenn man den gesamten Makrocode entfernt, bleiben nur 4 grundlegende Low-Level-Primitivbefehle zum Erzeugen von Boxen übrig:

Zum Erzeugen horizontaler Listen:

* \hbox{...}

Zum Erzeugen und Stapeln vertikaler Listen:

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

Wir werden nicht erklären, wie man alle diese Box-Befehle verwendet, da es im Web oder in TeX-/LaTeX-Büchern bereits viele Beispiele und Anleitungen dazu gibt — aber wir werden uns ansehen, wie Boxen innerhalb von TeX-Datenstrukturen dargestellt und gespeichert werden.

### Glue: flexibler Abstand

Glue ist im Grunde eine Form von Abstand, die von TeX verwendet wird, um Elemente horizontal oder vertikal zu platzieren. Als TeX-Benutzer können wir TeX anweisen, etwas Glue mit fester Größe einzufügen, oder wir können flexiblen Glue verwenden — mit so viel Flexibilität, wie wir brauchen, entweder zum Dehnen oder zum Schrumpfen, je nach unseren Anforderungen. Einer der TeX-Befehle zum Erzeugen von Glue für horizontalen Abstand heißt `\hskip` und hat die Form

`**\hskip** <natürliche Breite> **plus** <Betrag zum Strecken> **minus** <Betrag zum Schrumpfen>`

`**plus**` und `**minus**` sind TeX-Schlüsselwörter, aber Sie müssen sie nicht bei jedem Glue verwenden. Wenn `**plus**` oder `**minus**` fehlen, dann wird der entsprechende `<Betrag zum Strecken>` oder `<Betrag zum Schrumpfen>` als Null angenommen. Zum Beispiel `\hskip 3pt` fügt einen Glue mit fester Breite ein, ohne Streck- oder Schrumpfanteil.

Betrachten Sie vorerst `<Betrag zum Strecken>` und `<Betrag zum Schrumpfen>` als unsere *Vorgaben* an TeX, denn die genaue Menge an Dehnung oder Schrumpfung wird von TeX berechnet.

Zur Veranschaulichung dieser Ideen gibt es hier ein Diagramm, das Glue als Feder darstellt. Die `<natürliche Breite>` ist die Länge der Feder, wenn keine Spannung (Dehnung) oder Kompression (Schrumpfung) vorhanden ist. Die `<Betrag zum Strecken>` und `<Betrag zum Schrumpfen>` werden relativ zur natürlichen Länge der Feder dargestellt.

![{{{alt}}}](/files/53474fcce440eb377f3017715aad81518b10896c)

#### Ein \hbox-Beispiel

Angenommen, wir wollen eine `\hbox{...}` erzeugen, die nur die Buchstaben A, B, C und D enthält, und diese Box soll 100pt (100 TeX-Punkte) breit sein. Außerdem kann man sicher davon ausgehen, dass die Gesamtbreite dieser vier Zeichen weit unter 100pt liegt, was darauf hindeutet, dass TeX irgendeine Möglichkeit braucht, den verbleibenden Platz innerhalb der Box zu füllen: Dafür verwenden wir etwas Glue. Da wir jedoch die genaue Menge an Glue, die zum Füllen der Box erforderlich ist, nicht kennen, ist es ratsam, einige flexible Glues hinzuzufügen und TeX die Berechnung des Raums zu überlassen, den diese Glues einnehmen müssen. Im folgenden Codeausschnitt beachten Sie die Verwendung von „%“, um Wortzwischenräume zu unterdrücken, die durch die Zeilenendzeichen entstehen.

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

Die resultierende Box sieht dann so aus (zur besseren Übersicht vergrößert):

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

Diese `\hbox` wird mit gestrichelten Boxen (in Rot) überlagert, um die Breite der Zeichen anzuzeigen (so wie TeX sie sieht). Für Satzzwecke werden Zeichen als kleine Boxen betrachtet, und die Menge an Glue, die zum Füllen dieser `\hbox`erforderlich ist, wird unter Berücksichtigung der Breiten jedes Zeichens bestimmt (berechnet).

Es stellt sich heraus, dass TeX den Glue zwischen A und B nicht gedehnt oder geschrumpft hat (auf 4pt gesetzt), und zwischen B und C gibt es keinen Glue (auf 0pt gesetzt). Allerdings haben sich der Glue zwischen C und D sowie der Glue zwischen D und dem Ende der Box beide erheblich gedehnt, weil diese Glues den flexibelsten Streckanteil haben — effektiv haben diese Glues die gesamte zum Füllen der Box erforderliche Dehnung aufgenommen.

## Zurück zu LuateX

Bisher haben wir Boxen und Glue erkundet und gesehen, dass LuaTeX Zugriff auf interne TeX-Strukturen ermöglicht, die bei pdfTeX und XeTeX verborgen bleiben. Es ist Zeit für ein Beispiel, um das etwas deutlicher zu machen; zunächst müssen wir uns jedoch kurz mit der Art und Weise vertraut machen, wie TeX Boxen in seinem Speicher ablegt — wir beginnen mit einer Analogie.

### Wie TeX Boxen im Speicher ablegt: eine Analogie

Angenommen, Sie müssten aus irgendeinem Grund ein Datenmodell erstellen, das eine physische Box beschreibt. Welche Daten würden Sie wählen, um eine solche Beschreibung bereitzustellen? Ein Ansatz wäre, die Informationen in zwei Teile zu gliedern: Daten über die physische Box selbst und Daten, die eine Liste des Boxinhalts bereitstellen. Unser einfaches Modell könnte also so aussehen:

1. Daten über die physische Box („Metadaten“):

* width
* Höhe
* Tiefe
* Gewicht
* Farbe
* Typ (Holz, Kunststoff, Karton)

3. Daten zum Boxinhalt: eine Form von Liste, die die darin enthaltenen Elemente beschreibt — wahrscheinlich in keiner bestimmten Reihenfolge aufgeführt.

Und dazu gibt es eine sehr enge Analogie zur Art und Weise, wie TeX Boxen speichert.

### Wie TeX Boxen im Speicher ablegt: hlists und vlists

Intern erstellt TeX „Container“, sogenannte *hlists* (horizontale Listen) und *vlists* (vertikale Listen), die hboxes bzw. vboxes repräsentieren. Diese hlist-/vlist-Objekte stellen eine Sammlung von „Metadaten“ über die Box bereit und gewähren außerdem Zugriff auf die Liste der Objekte, aus denen die Box tatsächlich besteht — diese Liste wird *Node-Liste*. Anders als bei einer physischen Box, in der Sie Gegenstände in beliebiger Reihenfolge hineinlegen können, ist für TeX die Reihenfolge des Boxinhalts äußerst wichtig — es sind Satzbestandteile. Wenn Sie über einen Hintergrund in Programmierung oder Informatik verfügen, wird es Sie nicht überraschen zu erfahren, dass die Objekte innerhalb einer TeX-Box mithilfe einer sogenannten [doppelt verketteten Liste](https://en.wikipedia.org/wiki/Doubly_linked_list)gespeichert werden und ihre Erstellungsreihenfolge beibehalten wird. Wir werden auf verkettete Listen nicht weiter eingehen, da das Web vor Tutorials, Beispielen und Erklärungen nur so überquillt.

Das Konzept von Knoten und Knotenlisten ist ein grundlegender Aspekt der Funktionsweise von TeX, aber für die Zwecke dieses Artikels geben wir nur einen kurzen Überblick. Knoten sind im Wesentlichen eine Art „Mini-Container“, und (Stand LuaTeX 1.04) gibt es etwa 50 verschiedene Knotentypen: Sie spiegeln die inneren Datentypen und Komponenten wider, die LuaTeX zum Setzen verwendet. Es gibt zum Beispiel Knoten zur Darstellung von Glyphen (entstanden aus „Zeichen“), Glue, horizontalen/vertikalen Regeln, Strafen, „Whatsits“, Kernen und so weiter. Jedes gesetzte Material wird letztlich Teil einer riesigen Knotenliste, und LuaTeX gibt Ihnen direkten Zugriff auf diese inneren Datenstrukturen. LuaTeX erlaubt es Ihnen außerdem, Knotenlisten hinzuzufügen, zu bearbeiten, anzupassen oder zu erzeugen, sodass Sie zum Beispiel Boxen direkt in Lua-Code erstellen können, ohne überhaupt TeX-Code verwenden zu müssen. Darüber zu schreiben ist jedoch ein Thema für einen anderen Tag.

### Ein einfaches Beispiel für \directlua{...} in Aktion

Das folgende Beispiel erzeugt eine `\hbox` und speichert sie in Register 0. Anschließend geben wir die Breite der Box mit traditionellem TeX-Code aus und erhalten dieselben Informationen mit einer zweiten Methode über `\directlua{}`. Hier führen wir ein kleines Lua-Skript aus, das auf den internen Box-Speicherbereich von TeX zugreift, um die Breite der Box zu ermitteln — natürlich sind beide Werte identisch: 2412092sp (sp = scaled point: 65536sp = 1 TeX-Punkt). Letztlich untersuchen in diesem sehr einfachen Beispiel sowohl der TeX-Code als auch der Lua-Code dieselben internen Datenstrukturen, um die Breite der Box zu ermitteln, doch erst durch den direkten Zugriff öffnet LuaTeX die Tür zu einer Fülle von Informationen und Steuerungsmöglichkeiten, die bei anderen Engines nicht verfügbar sind.

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

```latex
\documentclass{article}
\begin{document}
\setbox0=\hbox{A\hskip 5pt B\hskip 10pt C}
\fontsize{18}{22}\selectfont
\noindent Mit \TeX{}-Code hat Box 0 die Breite \number\wd0\relax \space sp\par
\noindent Wir können auch Lua verwenden und eine der Funktionen von Lua\TeX aufrufen, um dieselben
Informationen zu erhalten.\vskip10mm
\noindent Aus Lua-Code hat Box 0 die Breite
\directlua{
local boxwidth = tex.box[0].width
tex.print(boxwidth.." sp")
}, was natürlich mit dem aus \TeX{}-Code erhaltenen Wert identisch ist.
\end{document}
```

## Alles zusammengeführt: Ein Overleaf-Projekt

Wir haben festgestellt, dass TeX intern Boxen als „Container“ darstellt, die hlists/vlists genannt werden und „Metadaten“ über die Box speichern sowie Zugriff auf die Liste der Komponenten bieten, aus denen die Box aufgebaut ist. Mit LuaTeX können Sie die Box-„Metadaten“ und die Liste der in einer TeX-Box enthaltenen Elemente aufrufen: Glyphen, Glue, Strafen, andere Boxen und so weiter. Mithilfe von Lua-Skripten ist es möglich, eine in TeXs Speicher liegende Box zu untersuchen und eine detaillierte Darstellung dessen zu zeichnen, was diese Box enthält. Eine geeignete Darstellung einer TeX-Box und ihres Inhalts wird durch *Node-Grafen* erreicht, und wir haben ein [Overleaf-Projekt](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) vorbereitet, das dies durch die Nutzung eines hervorragenden Lua-Skripts von Patrick Gundlach (siehe Danksagung) erledigt. Wir werden die detaillierten Prozesse, die erforderlich sind, um Boxen zu untersuchen und Node-Grafen zu erzeugen, nicht beschreiben — außer darauf hinzuweisen, dass jedes Programm/Skript, das TeX-Boxen verarbeitet, *rekursivem* rekursionsfähig sein muss,

![{{{alt}}}](/files/047869b7083622ab5e88a503ca863e1e93dc2bfc)

### Was bietet das Projekt?

Es implementiert nur 1 Befehl namens `\dobox{box command}`, zum Beispiel:

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

Die `\dobox{...}` Befehl führt eine Reihe von Aufgaben aus:

1. innerhalb Ihres Dokuments setzt er den unveränderten TeX-Code für Ihre Box;
2. er erzeugt eine SVG-Grafik der TeX-Box — Sie können diese in eine Webseite einbetten (so wie wir es in diesem Blogbeitrag getan haben);
3. er erzeugt eine SVG-Grafik der Node-Liste — diese können Sie ebenfalls in Webseiten einbetten (so wie wir es in diesem Blogbeitrag getan haben);
4. er gibt eine PDF-Grafik der Node-Liste aus, die dann in das vom Projekt erzeugte Haupt-PDF-Dokument importiert wird.

Node-Grafen können sehr schnell extrem groß werden, weil LuaTeX enorme Datenmengen speichern muss, um komplexe TeX-Boxen darzustellen — etwa die aktuell entstehende Seite oder gesetzte Mathematik. Bei größeren Knotenlisten kann die importierte PDF-Grafik durch die Seitenbegrenzung Ihres Dokuments abgeschnitten werden — wenn Sie einen großen Node-Grafen ansehen möchten, können Sie eine ZIP-Datei des Projekts herunterladen und die gewünschte PDF-Grafik extrahieren. Wenn Sie die ZIP-Datei des Projekts herunterladen, wählen Sie im Dropdown-Optionsmenü unbedingt „Input and Output Files“ aus:

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

### Grafiken aus dem Overleaf-Projekt: Eine kurze Beschreibung

Bevor wir einige Beispiele zeigen, ist es sinnvoll, ein paar Beobachtungen zu den vom Overleaf-Projekt erzeugten Grafiken zu machen — wir verwenden dasselbe `\hbox` Beispiel, das zuvor im Artikel erwähnt wurde. Hier ist es in der Projekt- `\dobox{...}` Befehl:

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

Hier ist die `\hbox` von TeX erzeugte Box — zur besseren Übersicht ist die Box vergrößert, aber der Rahmen ist in den vom Overleaf-Projekt erzeugten Grafiken enthalten.

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

Hier ist eine *annotierte* SVG-Darstellung der Node-Liste, die die obige Box repräsentiert — Anmerkungen wurden hinzugefügt, um die Box-„Metadaten“ und die Liste der darin enthaltenen Objekte hervorzuheben: Diese Anmerkungen sind in den vom Overleaf-Projekt erzeugten Grafiken nicht vorhanden.

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

Wenn Sie sich den Abschnitt „Metadaten“ ansehen, könnten Ihnen einige unbekannte Parameter auffallen:

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

Diese Parameter sind die Einstellungen, die TeX verwendet, um zu berechnen, wie stark der Glue innerhalb dieser Box gedehnt oder geschrumpft werden muss, und sie sind nur ein Beispiel für Daten, die Sie über LuaTeX leicht erhalten können, aber nicht mit anderen TeX-Engines. Beachten Sie, dass Glue-Knoten, die in den Box-Komponenten enthalten sind, *die ursprünglichen* Glue-Werte beibehalten, die wir zur Erzeugung der Box eingegeben haben. Dies ist wesentlich, weil TeX die Befehle `\unhbox`, `\unvbox`, `\unhcopy`, `\unvcopy` bereitstellt, die den Inhalt der Box „ausboxen“ und wieder in den Eingabestrom freigeben, damit er erneut an Satzvorgängen teilnehmen kann. Erst wenn TeX die Box schließlich als Ausgabe an eine PDF- oder DVI-Datei ausgibt (versendet), werden `glue_set`, `glue_sign` und `glue_order` auf alle in der Box enthaltenen Glues angewendet — um die tatsächliche Menge an Dehnung oder Schrumpfung zu berechnen, die erforderlich ist, um Komponenten innerhalb der Box zu positionieren, und anschließend geeignete PDF-Daten oder DVI-Opcode zu erzeugen.

Ein weiterer in den „Metadaten“ aufgeführter Parameter ist `shift`: Dies ist der Wert der Box-Verschiebung, der sich aus der Anwendung von TeX-Befehlen ergibt:

* `\raise`, `\lower` (angewendet auf ein `\hbox`);
* `\moveleft`, `\moveright` (angewendet auf eine `\vbox`).

In unserem Beispiel `shift` ist `\hbox` 0pt, weil wir die

Die [Overleaf-Projekt](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) gibt auch Node-Grafikdiagramme im PDF-Format aus: Hier ist ein Link zum Herunterladen einer [PDF-Dateiversion](https://www.filepicker.io/api/file/bezigXESC2FSasvjoh8A) des obigen Node-Grafen.

### Wie erzeugt das Overleaf-Projekt diese Grafiken?

Das Overleaf-Projekt nutzt die Möglichkeit, Software-Tools und Dienstprogramme auszuführen, die auf den Servern von Overleaf installiert sind — siehe [diesen Blogbeitrag](/latex/de/ausfuhrliche-artikel/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md) für weitere Details und ein Beispielprojekt. Um eine SVG-Grafik zu erzeugen, die eine TeX-Box darstellt, wird der TeX-Code der Box in eine kleine Datei geschrieben, die dann mit pdfTeX gesetzt wird, um eine DVI-Datei zu erzeugen — beachten Sie, dass das pdfTeX-Programm von LuaTeX mithilfe einiger Zeilen Lua-Code ausgeführt wird. Diese DVI-Datei wird im laufenden Betrieb mit dem `dvisvgm` Hilfsprogramm — das mit der auf den Servern von Overleaf installierten TeX-Live-Distribution ausgeliefert wird — nach SVG konvertiert. `dvisvgm` wird mit der Befehlszeilenoption `-n` ausgeführt, um sicherzustellen, dass jeder gesetzte Text in Linien/Kurven umgewandelt wird, sodass die korrekte Darstellung der SVG-Datei nicht davon abhängt, dass TeX-Schriften installiert sind.

Um die Node-Grafen zu erzeugen, verwenden wir ein Lua-Skript namens `hiviznodelist.lua` das auf Arbeiten von Patrick Gundlach basiert. Dieses Skript schreibt eine sogenannte `.gv` (Graphviz)-Datei, also eine Textdatei, die einen Node-Grafen enthält, der in der `dot` Sprache beschrieben ist. Die `.gv` Datei wird von einem Hilfsprogramm namens `dot` verarbeitet, das ein Node-Diagramm sowohl im PDF- als auch im SVG-Dateiformat ausgibt.

### Projektbeispiele

Hier sind einige zusätzliche Beispiele mit SVG-Grafiken, die mithilfe des Overleaf-Projekts erzeugt wurden. Boxen mit viel Text (z. B. in einer \vbox) oder komplexer Mathematik erzeugen enorme Node-Grafen — wenn Sie das Overleaf-Projekt erkunden, ist es ratsam, für die Demonstration der für Sie interessanten Funktionen keine unnötig komplexen Boxen zu verwenden.

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

Dieses Beispiel zeigt die Wirkung, wenn Text direkt in eine `\vbox`: Beachten Sie, dass die Knotenstruktur selbst bei einer so einfachen Box recht komplex ist. Der Grund für diese Komplexität ist, dass direkt in eine `\vbox` geschriebener Text TeX dazu veranlasst, einen Zeilenumbruch vorzunehmen. Sie können sehen, dass die `\vbox` 345pt breit ist: der Wert von `\hsize` zum Zeitpunkt, als diese Box erzeugt wurde. Beachten Sie außerdem, dass der Buchstabe „A“ in einer `hlist` enthalten ist, die ebenfalls 345 Punkte breit ist, und beachten Sie die große Strafe (10000) zusammen mit `\parfillskip` und `\rightskip` -Glues am Ende des Boxinhalts. Diese Strafe und die beiden Glue-Elemente werden durch TeXs Zeilenumbruchaktivitäten eingefügt. Wenn Sie sich den `glue_set` Wert für die Absatzzeile (`hlist`) ansehen, die den Buchstaben „A“ enthält, werden Sie feststellen, dass er extrem groß ist (322.500000): Warum ist das so? Das liegt daran, dass die Absatzzeile 345pt breit ist, aber nur eine `\parindent` und den Buchstaben „A“ enthält: Der verbleibende Raum muss durch das `\parfillskip` Glue gefüllt werden, das sich beträchtlich dehnen muss, um den restlichen Platz in der Zeile auszufüllen.

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

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

[PDF-Datei herunterladen](https://www.filepicker.io/api/file/nBS0uDs2QjqKCKljAm7r)

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

Es ist sehr aufschlussreich, dieses Beispiel mit dem vorherigen zu vergleichen. Hier ist nicht nur der Node-Graf deutlich kleiner, sondern die Breite der `\vbox` beträgt nur 7.50002pt: dieselbe Breite wie der Buchstabe „A“. Der Grund ist, dass das „A“ in eine `\hbox` eingewickelt wurde, was verhindert, dass die `\vbox` TeX dazu veranlasst, einen Zeilenumbruch vorzunehmen — eine wichtige Eigenschaft von mit `\vbox`.

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

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

[PDF-Datei herunterladen](https://www.filepicker.io/api/file/Yk3uCCQR5ao8Yd3TJCdE)

#### Einfache Mathematik: \hbox{$$\displaystyle \int f(x) dx$$}, komplexe Box!

Dieses Beispiel zeigt, dass selbst sehr einfach gesetzte Mathematik eine detaillierte Box-Struktur erzeugt: Das Setzen von Mathematik erzeugt *extrem* komplexe Datenstrukturen in TeX!

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

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

[PDF-Datei herunterladen](https://www.filepicker.io/api/file/D5TepsdaSdeYZvkuSEJt)

## Danksagung: Danke, Patrick!

Unser Dank gilt [Patrick Gundlach](https://twitter.com/patrickgundlach) der Overleaf die Erlaubnis erteilt hat, eine modifizierte Version seines Lua-Skripts zu verwenden und zu verbreiten, `viznodelist.lua`, das TeX-Boxen verarbeitet und eine Datei ausgibt (in der `dot` Sprache), die verarbeitet werden kann, um einen Node-Grafen zu zeichnen. Das Overleaf-Projekt enthält ein Lua-Skript namens `hiviznodelist.lua`— eine umbenannte und modifizierte Version von Patricks ursprünglichem Code, die auf [Github](http://gist.github.com/556247)verfügbar ist. Patrick hat ein auf LuaTeX basierendes Open-Source-Satzsystem namens [speedata Publisher](https://speedata.github.io/publisher/index.html) entwickelt, das Sie kostenlos herunterladen und verwenden können — kommerzielle Support-Optionen sind ebenfalls verfügbar.


---

# 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/de/ausfuhrliche-artikel/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.
