> 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/14-how-do-tex-engines-typeset-tables.md).

# Wie setzen TeX-Engines Tabellen

## Wie setzen TeX-Engines Tabellen?

## Einleitung: Was deckt diese Reihe ab?

Ästhetisch ansprechende Tabellen zu erstellen kann eine zeitaufwändige Aufgabe sein – ganz gleich, ob Sie ein visuelles Layout-Tool, LaTeX oder eine Auszeichnungssprache wie HTML oder Markdown verwenden. Insbesondere für LaTeX-Benutzer rangiert das Setzen von Tabellen bei vielen ganz oben auf der Liste der „Schmerzpunkte“, was vielleicht dadurch belegt wird, dass „Tabellen“ eines der am häufigsten [mit Tags versehenen Themen auf tex.stackexchange ist](https://tex.stackexchange.com/tags).

Zusätzlich zu den Antworten und Beispielen auf tex.stackexchange zeigt schon eine flüchtige Durchsicht der verfügbaren Unterstützung zum Setzen von Tabellen mit LaTeX, dass es eine Reihe tabellenbezogener Informationsquellen gibt:

* Overleafs [Hilfeseiten](https://www.overleaf.com/learn/latex/tables) und andere Seiten wie [learnlatex.org](https://www.learnlatex.org/en/lesson-08)
* CTAN, das Comprehensive TeX Network, listet über [70 TeX/LaTeX-Pakete](https://ctan.org/topic/table) zum Erstellen von Tabellen
* ein ganzes [Buch über das Setzen von Tabellen mit LaTeX](https://www.amazon.co.uk/Typesetting-Tables-LaTeX-Herbert-Voss/dp/1906860254)
* ein ausgezeichneter [Online-LaTeX-Tabellengenerator](https://www.tablesgenerator.com/latex_tables)

Eine einfache Google-Suche nach [LaTeX-Tabellen](https://www.google.com/search?q=latex+tables) liefert eine große Zahl von Treffern und listet viele Seiten mit Hilfe, Ratschlägen, Beispielen und Erklärungen auf.

### TeX, nicht LaTeX

Angesichts der Fülle an Literatur zum Setzen von Tabellen mit LaTeX – gibt es da noch mehr darüber zu schreiben: noch mehr Tabellenbeispiele sowie Aufzählungen/Vorführungen von Paketbefehlen? Gibt es eine Möglichkeit, sich dem Thema des Setzens von Tabellen so zu nähern, dass die grundlegenden Prinzipien und Konzepte des Tabellensatzes herausgearbeitet oder in den Mittelpunkt gestellt werden? Es gibt sie, aber dafür muss man die LaTeX-Zwiebel schälen…

Wir haben uns entschieden, eine Artikelserie zu erstellen, die den Lesern Hintergrundinformationen und Erklärungen zu den zugrunde liegenden *Mechanismen* des TeX-basierten Tabellensatzes liefern soll. Statt uns auf das Setzen von Tabellen mit bestimmten LaTeX-Makros/Paketen zu konzentrieren, werden wir das *zugrunde liegende Verhalten* von TeX-Engines untersuchen: die Satzmechanik auf niedriger Ebene erkunden, die die Grundlage bildet, auf der LaTeX-Makrobefehle aufgebaut sind. Das letztliche Ziel besteht darin, die Kernmethoden und Algorithmen des TeX-basierten Tabellensatzes herauszuarbeiten und zu erklären – in der Hoffnung, den Lesern/Benutzern zu helfen, besser zu verstehen, warum Tabellen sich so verhalten, wie sie es tun. Eine unvermeidliche Folge dieses Ansatzes, bei dem die schützenden Schichten der LaTeX-Makro-Isolierung abgetragen werden, ist der Kontakt mit chaotischen Details auf niedriger Ebene, vor denen Benutzer normalerweise (und erfreulicherweise) durch Schichten von LaTeX-Makrocode abgeschirmt sind.

Es hat viel Zeit gekostet, diese Artikel zu recherchieren, zu schreiben und zu illustrieren, daher hoffen wir, dass sie eine lohnende Ergänzung der Literatur darstellen und Material liefern, das Leser informiert und ihnen hilft, diesen komplexen Bereich des TeX-Setzens besser zu verstehen. Wir sollten betonen, dass diese Artikelserie *nicht* auch auf *Ästhetik* des Tabellendesigns eingehen wird – ein Thema voller subjektiver Vorlieben und eines, dessen Streitpunkte anderswo ausgetragen werden müssen…

### Die Mechanik von TeX-Tabellen erkunden: Wie kann man das tun?

Um die tieferen Mechanismen und Prozesse zu erkunden und dann darüber zu schreiben, die in TeX-Engines ablaufen, etwa beim Setzen von Tabellen, hat Overleaf „Debug“-Versionen von Knuths TeX-Engine mithilfe von Martin Ruckerts [Web2W-Verfahren](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html).

Traditionell erfolgt das Bauen von TeX über ein Verfahren namens Web2C, das in TeX Live verwendet wird und C-Code erzeugt, indem es TeXs ursprünglichen Pascal-Quellcode in sein C-Äquivalent umwandelt. Dieses Verfahren erzeugt C-Code, der niemals dafür gedacht war, von Menschen gelesen zu werden, sondern nur von C-Compilern. Der mechanisch erzeugte C-Code ist *außerordentlich* schwer zu lesen oder zu Experimentierzwecken zu ändern.

Im Gegensatz dazu erzeugt Web2W C-Quellcode (verfügbar [hier](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/ctex.c)) der *um Größenordnungen* lesbarer ist als von Web2C erzeugter Code. Folglich ist der C-Quellcode von Web2W wesentlich leichter für Lern- und Experimentierzwecke zu ändern.

Web2W erzeugt eine Version von TeX („CTeX“), die *extrem* Knuths ursprünglichem Programm nahekommt: „CTeX“ enthält nicht die vielen Änderungen und Verbesserungen, die durch den Web2C-Prozess eingeführt wurden – etwa SyncTeX, Kommandozeilenverarbeitung und Dateisuche über Kpathsea. Auch wenn Sie auf diese wertvollen Verbesserungen verzichten, ist der resultierende (Web2W-)C-Code mithilfe von Knuths veröffentlichtem TeX-Quellcode relativ leicht zu navigieren, obwohl TeX in Pascal geschrieben wurde.

* **Eine Anmerkung zu den Namen:** Genau genommen darf der Name „TeX“ sich nur auf die ursprüngliche Software beziehen, die Donald Knuth geschrieben und veröffentlicht hat. Jede Änderung an seiner Software muss für die daraus resultierende TeX-basierte Satzsoftware einen anderen Namen verwenden. Hier haben wir das Web2W-Verfahren verwendet, um eine Engine zu erstellen, die im Wesentlichen immer noch Knuths ursprüngliche Software ist. Um jedoch jeden Zweifel auszuschließen, verwenden wir den Begriff „CTeX“ für die spezielle Version, die mit Web2W erstellt wurde; wir verwenden aber auch „TeX“ entweder für Knuths ursprüngliche Engine oder als allgemeinen Begriff für die Satzsprache, die auf den Prinzipien von Knuths TeX basiert. Wir hoffen, die Leser verzeihen uns gelegentliche Abweichungen von der streng korrekten Terminologie: Der Sinn/die Absicht sollte aus dem Kontext klar werden.

Die Debug-Version von CTeX wurde unter Verwendung der [Eclipse-IDE](https://www.eclipse.org/downloads/packages/)ausgeführt, wodurch es möglich wurde, die Echtzeitverarbeitung des C-Codes zu beobachten, der die von Knuth entworfenen niedrigstufigen primitiven (integrierten) TeX-Befehle und Algorithmen implementiert, um den Tabellensatz zu unterstützen.

Das folgende kurze Video (ca. 90 Sekunden) demonstriert die CTeX-Engine, die in der [Eclipse-IDE](https://www.eclipse.org/downloads/packages/):

{% embed url="<https://videos.ctfassets.net/nrgyaltdicpt/7drdFwYR6h5xD88XnurDIH/36511f504755ab274f4da2e3f3fc1ce5/TeXtables.mp4>" %}

Zusätzlich zu CTeX haben wir auch e-TeX kompiliert, um auf einige zusätzliche Primitiven zuzugreifen, die in Knuths ursprünglicher Software nicht vorhanden sind. Obwohl CTeX und e-TeX inzwischen alte TeX-basierte Engines sind, eignen sie sich weiterhin als Grundlage, um die Mechanik des Tabellensatzes zu erkunden, denn diese zugrunde liegenden Prinzipien gelten weiterhin für alle TeX-basierten Satz-Engines.

### Warum eine ältere TeX-Engine verwenden, um Tabellen zu erkunden?

Erstens ist das gedruckte Buch, [TeX:The Program](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373), das TeXs Quellcode auflistet und erklärt, trotz seiner Veröffentlichung vor mehr als 30 Jahren (1986) immer noch ein äußerst praktischer Leitfaden durch die trüben Gewässer von TeXs inneren Abläufen. Natürlich können Sie TeXs Quellcodedokumentation selbst setzen; siehe zum Beispiel das Overleaf-Projekt [Setze die Quellcodedokumentation für TeX, e-TeX oder pdfTeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv). Seit der Veröffentlichung von TeX:The Program im Jahr 1986 haben sich neue TeX-Engines entwickelt, darunter pdfTeX, XeTeX und LuaTeX-Varianten, die alle Funktionen und Befehle einführen, die in TeX:The Program nicht dokumentiert sind, einfach weil sie in Knuths ursprünglicher Software nicht vorhanden waren.

Für viele Kernprozesse, wie etwa TeXs Tabellensatz, ist der in TeX:The Program dokumentierte Code weiterhin als Grundlage für das Studium relevant – auch wenn TeXs Quellcode in Pascal geschrieben ist. Darüber hinaus lässt sich Knuths TeX vergleichsweise leicht und schnell kompilieren – insbesondere dank des äußerst nützlichen [Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html) -Verfahrens, das von Martin Ruckert entwickelt wurde. Die einfache und schnelle Kompilierung macht es viel bequemer, TeX auf einfache Weise zu modifizieren – etwa für die Erstellung von SVG-Grafiken, die später in dieser Artikelserie verwendet werden.

### Den Unterschied zwischen TeX und LaTeX verstehen

Viele Leser wissen bereits, dass LaTeX eigentlich kein *ausführbares* Satzprogramm ist, sondern eine große Sammlung von Befehlen (*Makros*), die letztlich in einer niedrigstufigeren Satz-/Programmiersprache namens TeX geschrieben sind. Ihr LaTeX-Code erzeugt gesetzte Ausgabe erst, nachdem er von einem ausführbaren Programm verarbeitet wurde, das man eine *TeX-Engine*nennt – die Software, die zwischen Ihrem LaTeX-Code (Dokument) und dem gesetzten PDF steht. Heute können Benutzer zwischen verschiedenen TeX-Engines wählen, um ihren LaTeX-Code zu setzen, darunter pdfTeX, XeTeX und Varianten von LuaTeX.

Wer neu im TeX/LaTeX-Ökosystem ist, wird oft – und verständlicherweise – von der Vielzahl kryptisch klingender Namen für die Werkzeuge verwirrt, denen er begegnet: TeX, LaTeX, pdfTeX, pdfLaTeX, XeTeX, XeLaTeX, LuaTeX und LuaLaTeX. Wenn es Ihnen genauso geht, hilft der Overleaf-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) weiter, der Ursprung und Bedeutung all dieser Begriffe erklärt.

#### Dialekte und TeX-Primitiven

Jede TeX-Engine hat einen Satz eingebauter Befehle namens *Primitiven* die zusammen den „Dialekt“ dieser Engine der TeX-Satzsprache bilden und die in jede Engine eingebauten Fähigkeiten widerspiegeln. Hier bedeutet der Begriff „primitiv“, der zur Beschreibung der eingebauten Befehle von TeX-Engines verwendet wird, *nicht* nicht, dass diese Befehle grundlegend oder simpel sind, sondern dass sie fundamental und unteilbar sind: nicht aus anderen Befehlen aufgebaut (anders als Makros). Alle TeX-Engines teilen sich einen großen Kernbestand an Primitiven, aber einige enthalten enginespezifische Primitiven – woraus sich die Vorstellung eines „Dialekts“ von TeX ergibt.

Unabhängig davon, welche TeX-Engine zum Setzen Ihres LaTeX-Dokuments verwendet wird, besteht ihre Aufgabe darin, die Sammlung von LaTeX-Befehlen (d. h. Makros) zu verarbeiten („auszuführen“), mit denen Ihr Dokument geschrieben und aufgebaut wird. Tatsächlich „übersetzt“ die TeX-Engine Ihren LaTeX-Code (Makros) *zurück in* ihre Bestandteile, also die primitiven Befehle der TeX-Engine, die die Engine ausführen kann, um das eigentliche Setzen vorzunehmen. Sie müssen *müssen* keine LaTeX-Befehle verwenden, um Dokumente mit TeX-Engines zu setzen — Sie *könnten* sich dafür entscheiden, Ihre Dokumente vollständig mit TeX-Primitiven zu erstellen, d. h. direkt in der niedrigstufigen *TeX-Programmiersprache* eingebaut in TeX-Engines. Allerdings ist die TeX-Sprache nach heutigen Maßstäben ziemlich rätselhaft und wird im Allgemeinen als schwierig zu programmierende Sprache angesehen – außerdem kann sie eine große Anzahl eingebauter Primitiven erfordern, um Ihr Satzziel zu erreichen, was die Programmieraufgabe fehleranfällig und potenziell repetitiv macht.

Um zu vermeiden, direkt in der TeX-Sprache schreiben zu müssen oder ständig dieselbe Befehlsfolge neu einzugeben, erlauben TeX-Engines das Erstellen von „Abkürzungen“ namens *Makros*Makros. Mit der Erstellung von Makros definieren Sie Ihre eigenen Befehle, die möglicherweise lange und komplexe Sequenzen von TeX-Sprachprimitiven (oder anderen Makros) in einen einzigen „höherstufigen“ Befehl verpacken. TeX-Programmierer können sehr ausgefeilte Makros schreiben, die in einem einzigen Befehl eine große Funktionsvielfalt kapseln – wie etwa die von LaTeX bereitgestellten Befehle. Durch die Verwendung von Makropaketen wie LaTeX (oder [ConTeXt](https://wiki.contextgarden.net/Main_Page)) sind Dokumentautoren (weitgehend) vor vielen mühsamen Details abgeschirmt, sodass sie sich auf das Schreiben und Setzen konzentrieren können, anstatt ständig mit den Komplexitäten und Nuancen der TeX-Sprache zu ringen.

## Am Anfang...

Zusammen mit der Entwicklung von Algorithmen zum Setzen von Mathematik und ausgeklügeltem Zeilenumbruch stand Knuth vor der Herausforderung, seine TeX-Software so zu programmieren, dass sie Tabellen setzt. Offensichtlich dürfen etwaige Tabellenkonstruktionsalgorithmen nicht übermäßig restriktiv sein, da dies Benutzer frustrieren würde, die die Freiheit benötigen, nahezu unendlich viele Tabellenlayouts zu erstellen. Außerdem können Tabellenzellen eine breite Palette von Inhalten enthalten, darunter Mathematik, Grafiken und Stücke von Text, die in schön gesetzte Zeilen umbrochen sind – tatsächlich alles, was TeX setzen kann. Um diese Flexibilität zu bieten, müssen TeXs Tabellenaufbaualgorithmen Hand in Hand mit anderen Teilen von TeXs Satzmechanik arbeiten.

Allerdings bezahlen TeX-Engines die gebotene Flexibilität ihrer Tabellenkonstruktionsfähigkeiten mit zahlreichen Feinheiten und Nuancen im niedrigstufigen Verhalten der eingebauten (primitiven) Befehle zum Setzen von Tabellen, von denen es 9 gibt:

* **`\halign`**, **`\valign`**: zentrale Befehle zum Tabellenaufbau
* **`\tabskip`**: Leim, der zwischen \halign-Spalten oder \valign-Zeilen eingefügt wird
* **`\cr`**: obligatorisches „carriage return“-Abschlusszeichen für alle Zeilen in einer Tabelle
* **`\noalign`**: Material zwischen \halign-Zeilen oder \valign-Spalten einfügen
* **`\everycr`**: Befehle (Token-Register), die nach dem Erkennen von \cr gelesen werden
* **`\span`**: ein Befehl mit Doppelfunktion: \span erstellt Zellen, die sich über Spalten oder Zeilen erstrecken, oder erweitert Befehle in der Tabellenpräambel (wir werden das im Detail betrachten)
* **`\omit`**: die Vorlagen für eine bestimmte Zelle überspringen
* **`\crcr`**: wird in Makros verwendet, um Fehler zu vermeiden, wenn Benutzer ein erforderliches \cr vergessen

Wir werden diesen Befehlen auf unserer Reise durch den Tabellenaufbau begegnen.

### Entfernte Echos der Herausforderungen

Vergraben in [dem Quellcode von TeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) findet sich eine etwas einschüchternde Einführung in das Thema der Implementierung der niedrigstufigen Befehle \halign und \valign, die zum Setzen von Tabellen entworfen wurden:

> „Es ist irgendwie ein Wunder, wenn \halign und \valign funktionieren, weil sie so viele von TeXs Kontrollstrukturen durchschneiden. Daher ist die vorliegende Seite wahrscheinlich nicht der beste Ort für einen Anfänger, um mit dem Lesen dieses Programms zu beginnen; es ist besser, zuerst alles andere zu beherrschen.“

Knuth fährt fort zu sagen

> „Beachten Sie, dass wir, während \halign verarbeitet wird, furchtlos die Kontrolle dem Rest von TeX überlassen. An kritischen Punkten wird eine Ausrichtungsroutine herangezogen, um einzuspringen und eine kleine Aktion auszuführen, aber die meiste Zeit lauern diese Routinen nur im Hintergrund. Es ist ein bisschen wie posthypnotische Suggestion.“

Aus diesen Kommentaren scheint es vernünftig zu dem Schluss zu kommen, dass selbst für Knuth die Implementierung von TeXs Tabellensatz „eine ziemliche Herausforderung“ war – dem Benutzer Kontrolle und Flexibilität zu bieten und gleichzeitig sicherzustellen, dass TeXs automatisierte Tabellenkonstruktionsalgorithmen gut mit TeXs zentralen Satzprozessen orchestriert werden.

Der Autor bezeugt ohne Weiteres die Komplexität des Codes und der Algorithmen hinter TeXs Tabellensatzfähigkeiten, aber auch seine Bewunderung für die schiere Menge an Leistungsfähigkeit, die in einer relativ kleinen Menge an – wenn auch dichtem – Pascal- (oder C-)Code enthalten ist.


---

# 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/14-how-do-tex-engines-typeset-tables.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.
