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

# Wie setzen TeX-Engines Tabellen 2

## Wie setzen TeX-Engines Tabellen 2

## TeX-Engines bezeichnen Tabellen als Ausrichtungen

Innerhalb der [Dokumentation des Quellcodes von TeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) Knuth erörtert nicht TeX’ Fähigkeit, „Tabellen zu setzen“, sondern beschreibt stattdessen TeXs Algorithmen zum Erstellen sogenannter *Ausrichtungen*. Das Setzen von Tabellen in TeX ist im Grunde ein automatisierter Box-Ausrichtungsprozess: Das Anordnen von Boxen (Tabellenzellen, Zeilen und Spalten), um ein ansprechendes rechteckiges Gitter oder Array zu erzielen – wobei es natürlich bei TeX *viele* Nuancen in diesem Prozess gibt.

Der Begriff „alignment“ spiegelt sich auch in den Namen der beiden in alle TeX-Engines eingebauten Tabellen-Setzbefehle wider:

* `\halign` (horizontale Ausrichtung), und
* `\valign` (vertikale Ausrichtung).

Wir werden beide Befehle in dieser Artikelserie untersuchen, beginnend mit einem formelleren Überblick über das Format/die Struktur der `\halign` und `\valign` Befehle, um die Grundlagen für spätere, ausführlichere Artikel in dieser Serie zu legen.

### TeX-Tabellen bestehen aus Boxen und Abstand

Individuelle Tabellenzellen enthalten typischerweise verschiedene Inhalte wie Textzeilen, Mathematik oder Grafiken, was zu einer Menge von Tabellenzellen mit unterschiedlichen Breiten, Höhen oder Tiefen von gesetztem Material führt. Irgendwie muss TeX mit diesen Zellen unterschiedlicher Inhaltsabmessungen arbeiten, um die endgültige Tabelle zu konstruieren, in der jede Zeile eine bestimmte Höhe und jede Spalte eine bestimmte Breite hat. TeX muss aus der Sammlung unterschiedlich großer Tabellenzellen geeignete Werte für die Höhen jeder Zeile und die Breiten jeder Spalte ableiten.

TeX kann die tatsächliche Größe des Inhalts jeder Zelle jedoch erst kennen, nachdem dieser Inhalt gesetzt wurde; folglich verarbeitet TeX die gesamte Tabelle, setzt jede Zelle, um die für den Abschluss des Tabellenlayouts erforderlichen Größendaten zu erhalten. Aus diesen Größendaten kann TeX die richtige Höhe für jede Zeile und Breite für jede Spalte bestimmen. TeX kann auch auf leere Zellen oder Zellen stoßen, die der Benutzer über mehrere Spalten oder mehrere Zeilen erstrecken möchte, und all dies muss TeX bei seinen Berechnungen sorgfältig berücksichtigen. Erst nach dem „Filtern“ dieser heterogenen Sammlung von Zell-(Box-)Größendaten kann TeX dann die endgültigen Werte für die Spaltenbreiten in einer `\halign`, oder Zeilenhöhen für `\valign` und verwendet diese Werte in den letzten Phasen seiner Tabellenlayout-Algorithmen.

In der Praxis und „unter der Haube“ besteht das Setzen von Tabellen in TeX aus mehreren Schritten. Grob gesagt setzt TeX zunächst eine „Entwurfs-“ oder „unvollständige“ Version der Tabelle, während es die Zellgrößendaten und Daten zu etwaigen `\span` in der Tabelle verwendeten Befehlen erfasst und verarbeitet. In den letzten Schritten verarbeitet TeX diese „unvollständige“ Version der Tabelle erneut, um `\halign` Spaltenbreiten oder `\valign` Zeilenhöhen festzulegen und das vollständige Layout zu erreichen – all dies werden wir in dieser Artikelserie untersuchen.

## \halign und \valign: zwei Arten, Tabellen zu konstruieren

Alle TeX-Engines bieten zwei *eingebaute* Befehle (Primitive) zum Setzen von Tabellen (Ausrichtungen): `\halign` und `\valign`, die viele Kernfunktionen gemeinsam haben, sich aber in einigen grundlegenden Punkten unterscheiden. Der wesentliche Unterschied zwischen `\halign` und `\valign` besteht darin, wie sie ihre jeweiligen Tabellen konstruieren: zeilenweise oder spaltenweise:

* `\halign`: setzt Tabellen zeilenweise, um einzelne Zeilen zu erzeugen, die vertikal gestapelt werden, um die Spalten der Tabelle zu bilden
* `\valign`: setzt Tabellen spaltenweise, um einzelne Spalten zu erzeugen, die horizontal nebeneinander gestapelt werden, um die Zeilen der Tabelle zu bilden

### \halign

Das folgende Diagramm zeigt den Aufbau einer Tabelle, die von `\halign`. Die Tabelle wird zeilenweise gesetzt, wobei einzelne Zeilen vertikal gestapelt werden. Einige Folgen davon sind:

* die Tabellenspalten entstehen durch vertikales Stapeln der Tabellenzeilen
* Seitenumbrüche können zwischen den Tabellenzeilen erfolgen
* nicht-tabellarisches Material kann zwischen Zeilen eingefügt werden (über `\nolign`, worauf wir später eingehen werden)

![](/files/63878cd71aec5c738aaf6ab3c81483408bb339b0)

### \valign

Das folgende Diagramm zeigt den Aufbau einer Tabelle, die von `\valign`. Die Tabelle wird spaltenweise gesetzt, wobei einzelne Spalten horizontal (nebeneinander) gestapelt werden. Einige Folgen davon sind:

* die Tabellenzeilen entstehen durch horizontales Stapeln der Tabellenspalten
* Zeilenumbrüche können zwischen den Tabellenspalten erfolgen
* nicht-tabellarisches Material kann zwischen Spalten eingefügt werden (über `\noalign`, worauf wir später eingehen werden)

![](/files/5ee9b1233f425945ce849a5e8c9518fbae142588)

### Beispiele

Das folgende Beispiel soll den zeilenweisen *vs.*. Spaltenansatz von \halign und \valign hervorheben.

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Eng anliegende Box-Ränder
\setlength{\fboxsep}{0pt}

Hier ist eine \verb|\valign|-Tabelle:
\begingroup
% \hsize steuert die \valign-
% Spaltenbreiten. Wir setzen außerdem
% \parindent auf einen kleineren Wert
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr % Die Präambel: später behandelt (sehr ausführlich!)
A&B&C\cr % Die erste SPALTE dieser \valign-Tabelle
D&E&F\cr
G&H&I\cr
}}
\endgroup

% Hinweis: Aus später erläuterten Gründen
% muss die \halign in eine \vbox gesetzt werden
Hier ist eine \verb|\halign|-Tabelle: \fbox{%
\vbox{\halign{
#&#&#\cr % Die Präambel: später behandelt (sehr ausführlich!)
A&B&C\cr % Die erste ZEILE dieser \halign-Tabelle
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Öffnen Sie dieses Beispiel in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%25+%5Chsize+controls+the+%5Cvalign+%0A%25+column+widths.+We+also+set+%0A%25+%5Cparindent+to+a+smaller+value%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+COLUMN+of+this+%5Cvalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0A%25+Note%3A+for+reasons+explained+later%0A%25+the+%5Chalign+has+to+be+put+in+a+%5Cvbox%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A+%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+ROW+of+this+%5Chalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Dieses Beispiel erzeugt die folgende Ausgabe: ![](/files/96cfc6d051f94d7f2805592cb4c3883fca4f1585)

Die folgende Grafik zeigt eine kommentierte Version der Tabellen, die durch den obigen Code erzeugt werden. Später in dieser Artikelserie werden wir Themen behandeln wie:

* was sind Tabellenpräambeln?
* warum setzen wir `\hsize` und `\parindent` für `\valign` Tabellen?

Für den Augenblick notieren Sie sich einfach den zeilenweisen vs. spaltenweisen Ansatz von `\halign` *vs.*. `\valign` der Tabellenkonstruktion:

![](/files/c1b9d796c3a12fa616a8f7ec923fedb16dfb880a)

## Allgemeine Form von \halign und \valign

Zunächst werden wir die grundlegenden Eigenschaften und das allgemeine Format von `\halign` und `\valign` besprechen, aber noch nicht ins Detail gehen. [Wie erwähnt](#intro), wählen wir einen etwas formelleren Überblick über die Form/Struktur der `\halign` und `\valign` Befehle, um die Grundlage für spätere Artikel in dieser Serie zu legen.

Die allgemeinste Form der `\halign` und `\valign` Befehle kann wie folgt geschrieben werden:

`\halign` $$\langle$$⁠`optionale Spezifikation`⁠$$\rangle$$ { $$\langle$$⁠`Präambel`⁠$$\rangle$$ $$\langle$$⁠`Rumpf`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`optionale Spezifikation`⁠$$\rangle$$ { $$\langle$$⁠`Präambel`⁠$$\rangle$$ $$\langle$$⁠`Rumpf`⁠$$\rangle$$ }

Wie Sie sehen, umfassen beide `\halign` und `\valign` drei Hauptabschnitte:

* [$$\langle$$⁠`optionale Spezifikation`⁠$$\rangle$$](#optspec)
* [$$\langle$$⁠`Präambel`⁠$$\rangle$$](#preamble)
* [$$\langle$$⁠`Rumpf`⁠$$\rangle$$](#body)

## Das $$\langle$$⁠optionale Spezifikation⁠$$\rangle$$

Die Standardgröße/-ausdehnung einer Tabelle, ihre sogenannte „natürliche Größe“, wird durch ihren Inhalt bestimmt – um das zu verdeutlichen: Mit Größe/Ausdehnung ist hier

* die *Breite* einer von `\halign`, oder
* die *Höhe* einer von `\valign`

Ein $$\langle$$⁠`optionale Spezifikation`⁠$$\rangle$$ kann verwendet werden, um die natürliche Größe der Tabelle zu „überschreiben“, und nimmt eine von zwei Formen an:

* **`auf`** $$\langle$$**⁠`Dimension`⁠**$$\rangle$$
* **`Ausdehnung`** $$\langle$$**⁠`Dimension`⁠**$$\rangle$$

wobei

* $$\langle$$**⁠`Dimension`⁠**$$\rangle$$ ist eine Länge, angegeben in Einheiten, die TeX versteht, wie pt, mm oder cm – die Länge kann auch als Befehl angegeben werden, der zu einem Wert expandiert, der in geeigneten Einheiten angegeben ist;
* **`auf`** und **`Ausdehnung`** sind TeX-Schlüsselwörter, die den Typ der „Überschreibung“ der natürlichen Größe angeben:
  * **`auf`**: setzt die Größe der Tabelle auf die angegebene $$\langle$$⁠`Dimension`⁠$$\rangle$$ Wert
  * **`Ausdehnung`**: addiert die angegebene $$\langle$$⁠`Dimension`⁠$$\rangle$$ den Wert zur natürlichen Größe der Tabelle

Die Wirkung einer $$\langle$$⁠`optionale Spezifikation`⁠$$\rangle$$ hängt vom Typ der gesetzten Tabelle ab: Sie passt eine `\halign` natürliche Größe der Tabelle *Breite*, oder eine `\valign` natürliche Größe der Tabelle *Höhe*.

Hier sind einige Beispiele:

* `\halign **to 100pt**{...}`: setzt die `\halign` Breite der Tabelle auf `100pt`
* `\valign **to 50pt**{...}`: setzt die `\valign` Höhe der Tabelle auf `30pt`
* `\halign **spread 30pt**{...}`: fügt 30pt zur `\halign` natürlichen Breite der Tabelle hinzu. Umgekehrt würde **spread -30pt** die Breite der Tabelle um 30pt verringern.
* `\valign **spread 20pt**{...}`: fügt 20pt zur `\valign` natürlichen Höhe der Tabelle hinzu. Umgekehrt würde **spread -20pt** die Höhe der Tabelle um 20pt verringern.

Der folgende Code verwendet die obigen Tabellenbeispiele erneut, wendet jedoch eine $$\langle$$⁠`optionale Spezifikation`⁠$$\rangle$$ auf eine `\valign` und `\halign` Tabelle an:

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Eng anliegende Box-Ränder
\setlength{\fboxsep}{0pt}

Hier ist eine \verb|\valign|-Tabelle:
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup

Hier ist eine \verb|\halign|-Tabelle:
\fbox{
\vbox{\halign to 100pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Öffnen Sie dieses Beispiel in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign+to+100pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Dieses Beispiel erzeugt die unten gezeigte Ausgabe:

![](/files/87f4ef3b8876fdcbce6ddefb59902cfcfe9578d2)

—beachten Sie jedoch, wie der Inhalt beider Tabellen „zusammengedrängt“ ist. Der Grund dafür ist das Fehlen flexibler Abstände (Glue), die TeX verwenden kann, um den Inhalt so zu strecken, dass der durch **`auf`** $$\langle$$**⁠`Dimension`⁠**$$\rangle$$. Hier springen wir vor, um `\tabskip` Befehl einschließen.

#### Eine erste Einführung in den Befehl \tabskip

Die Ästhetik des Tabellenlayouts kann eine Anpassung des Abstands zwischen seinen Zeilen oder Spalten erfordern, daher bieten TeX-Engines erwartungsgemäß einen Befehl namens `\tabskip` mit dem Sie das tun können. `\tabskip` wird verwendet, um die Menge an flexiblem Raum („Glue“) festzulegen (und zu variieren), die TeX zwischen den Spalten einer `\halign` oder zwischen den Zeilen einer `\valign`. Spätere Artikel werden `\tabskip` viel ausführlicher untersuchen.

Als einführendes Beispiel verwendet der folgende Code eine Einstellung für `\tabskip` die TeX dazu veranlasst, etwas (sehr) flexiblen Raum zwischen den Zeilen einer `\valign` Tabelle einzufügen. Dieser flexible Raum erlaubt es den Tabellenzeilen, sich auszudehnen und den zusätzlichen Raum auszufüllen, der durch die $$\langle$$⁠`optionale Spezifikation`⁠$$\rangle$$ von **`auf 50pt`**:

```latex
\documentclass{article}
\setlength{\fboxsep}{0pt}
\setlength{\parindent}{0pt}
\newcommand{\optspec}{\(\langle \texttt{optionale Spezifikation} \rangle\)}
\begin{document}
\pagestyle{empty}
Hier ist eine \verb|\valign|-Tabelle:
\vspace{6pt}

\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

Hier ist dieselbe \verb|\valign|-Tabelle, aber mit einer \optspec{} von ``\texttt{to 50pt}``. Beachten Sie, wie die Zeilen „zusammengedrängt“ sind, weil zwischen den Zeilen kein „dehnbarer Glue“ verfügbar ist:

\vspace{6pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

Wir verwenden die \verb|\valign|-Tabelle mit einer \optspec{} von ``\texttt{to 50pt}``, stellen aber über den Befehl \verb|\tabskip| „flexiblen Abstand“ bereit. Hier liefert \verb|\tabskip| genügend „Glue“, um die Zeilen der \verb|\valign| „zu strecken“ und jeden verfügbaren zusätzlichen Raum auszufüllen. Hier ist die „gestreckte“ \verb|\valign|-Tabelle:

\tabskip=0pt plus1fil % Dies setzt \tabskip auf einen sehr flexiblen Glue
\vspace{6pt}

\def\mylen{50pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to \mylen{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\end{document}
```

[Öffnen Sie dieses Beispiel in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+example+using+tabskip+glue\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Csetlength%7B%5Cparindent%7D%7B0pt%7D%0A%5Cnewcommand%7B%5Coptspec%7D%7B%5C%28%5Clangle+%5Ctexttt%7Boptional+specification%7D+%5Crangle%5C%29%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+with+an+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27.+Note+how+the+rows+are+%60%60bunched+up%27%27+because+there%27s+no+available+%60%60stretchable+glue%27%27+between+the+rows%3A+%0A%0A%5Cvspace%7B6pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AWe%27ll+use+the+%5Cverb%7C%5Cvalign%7C+table+with+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27%2C+but+provide+%60%60flexible+spacing%27%27+via+the+%5Cverb%7C%5Ctabskip%7C+command.+Here%2C+%5Cverb%7C%5Ctabskip%7C+is+providing+enough+%60%60glue%27%27+to+enable+the++%5Cverb%7C%5Cvalign%7C+rows+to++%60%60stretch+out%27%27+and+fill+any+available+extra+space.+Here+is+the+%60%60stretched+out%27%27+%5Cverb%7C%5Cvalign%7C+table%3A%0A%0A%5Ctabskip%3D0pt+plus1fil+%25+This+sets+%5Ctabskip+to+a+very+flexible+glue%0A%5Cvspace%7B6pt%7D%0A%0A%5Cdef%5Cmylen%7B50pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+%5Cmylen%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Dieses Beispiel erzeugt die folgende Ausgabe:

![](/files/b17cf41d60dae4df86b554321d3c182362365a40)

## Einführung in die Tabelle $$\langle$$⁠Präambel⁠$$\rangle$$ und $$\langle$$⁠Rumpf⁠$$\rangle$$

Dieser Abschnitt bietet eine Einführung in die Tabelle $$\langle$$⁠`Präambel`⁠$$\rangle$$, und *kurz* streift die Tabelle $$\langle$$⁠`Rumpf`⁠$$\rangle$$ die anschließend [detaillierter untersucht wird](#bodydetails).

Spätere Artikel in dieser Serie werden die $$\langle$$⁠`Präambel`⁠$$\rangle$$ und $$\langle$$⁠`Rumpf`⁠$$\rangle$$ ausführlicher untersuchen, insbesondere TeXs Verwendung und Verarbeitung der Tabelle $$\langle$$⁠`Präambel`⁠$$\rangle$$.

Wie oben erwähnt, ist das allgemeinste Format von `\halign` oder `\valign` Tabellen kann wie folgt geschrieben werden:

`\halign` $$\langle$$⁠`optionale Spezifikation`⁠$$\rangle$$ { $$\langle$$⁠`Präambel`⁠$$\rangle$$ $$\langle$$⁠`Rumpf`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`optionale Spezifikation`⁠$$\rangle$$ { $$\langle$$⁠`Präambel`⁠$$\rangle$$ $$\langle$$⁠`Rumpf`⁠$$\rangle$$ }

### Das $$\langle$$⁠Präambel⁠$$\rangle$$

Das $$\langle$$⁠`Präambel`⁠$$\rangle$$ Abschnitt enthält eine einzelne $$\langle$$⁠`Präambelzeile`⁠$$\rangle$$ übernommen, das *beendet* durch das `\cr` Befehl; folglich kann die $$\langle$$⁠`Präambel`⁠$$\rangle$$ wie folgt umgeschrieben werden:

$$\langle$$⁠`Präambel`⁠$$\rangle$$=$$\langle$$⁠`Präambelzeile`⁠$$\rangle$$**`\cr`**

### Das $$\langle$$⁠Rumpf⁠$$\rangle$$

Entsprechend kann der $$\langle$$⁠Rumpf⁠$$\rangle$$ Abschnitt weiter in eine oder mehrere Bestandteile „Zeilen“ unterteilt werden, doch hier gibt es für jede Zeile zwei Optionen:

* eine Zeile, die aus einer Menge von Zellen besteht, die eine `\halign` Zeile oder `\valign` Spalte bilden; oder
* eine `\noalign` Befehl, der Material zwischen die `\halign`-Zeilen oder `\valign`-Spalten „einspeist“.

Für den Augenblick ignorieren wir den `\noalign` Befehl (siehe [später im Artikel](#noalign)) und nehmen an, dass jede Zeile des $$\langle$$⁠Rumpf⁠$$\rangle$$ die Daten für eine Menge von Zellen ist und *beendet* durch `\cr` Befehl einschließen.

Wenn man `\noalign`, das $$\langle$$⁠`Rumpf`⁠$$\rangle$$ den Abschnitt ignoriert, der den Inhalt des Benutzers darstellt, enthält er eine Folge von Zeilen, die wir jeweils als $$\langle$$⁠`Rumpfzeile`⁠$$\rangle$$ die *beendet* von ihrer zugehörigen `\cr` Befehl einschließen.

Das $$\langle$$⁠`Rumpf`⁠$$\rangle$$ wie folgt umgeschrieben werden:

$$\langle$$⁠Rumpfzeile⁠$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠Rumpfzeile⁠$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠Rumpfzeile⁠$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠Rumpfzeile⁠$${}*\mathrm{N}$$⁠$$\rangle$$\cr

Zusammengefasst können wir das allgemeine Format von `\halign` und `\valign` wie folgt umschreiben:

`\halign` $$\langle$$⁠`optionale Spezifikation`⁠$$\rangle$$ { $$\langle$$⁠`Präambelzeile`⁠$$\rangle$$\cr $$\langle$$⁠Rumpfzeile⁠$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠Rumpfzeile⁠$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠Rumpfzeile⁠$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠Rumpfzeile⁠$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

`\valign` $$\langle$$⁠`optionale Spezifikation`⁠$$\rangle$$ { $$\langle$$⁠`Präambelzeile`⁠$$\rangle$$\cr $$\langle$$⁠Rumpfzeile⁠$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠Rumpfzeile⁠$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠Rumpfzeile⁠$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠Rumpfzeile⁠$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

Aus Gründen, die in späteren Artikeln behandelt werden, hat die $$\langle$$⁠`Präambel`⁠$$\rangle$$, nur eine einzige $$\langle$$⁠`Präambelzeile`⁠$$\rangle$$, hat ein anderes Format als alle Zeilen in der Tabelle $$\langle$$⁠`Rumpf`⁠$$\rangle$$. Wir werden außerdem [die `\noalign` Befehls](#noalign) erneut betrachten, die auch innerhalb der Tabelle verwendet werden kann $$\langle$$⁠`Rumpf`⁠$$\rangle$$.

### Das $$\langle$$⁠Präambelzeile⁠$$\rangle$$

Das $$\langle$$⁠`Präambelzeile`⁠$$\rangle$$ spielt eine *entscheidende* Rolle beim Setzen von Tabellen, weil sie so etwas wie einen „Bauplan“ liefert, der zum Setzen des Inhalts verwendet wird –`\halign` Zeilen oder `\valign` Spalten – die in der Tabelle enthalten sind $$\langle$$⁠`Rumpf`⁠$$\rangle$$. Die $$\langle$$⁠`Präambelzeile`⁠$$\rangle$$ kann auch Zell-„Vorlagen“ enthalten, die zum Erstellen der Zeilen einer `\halign` oder der Spalten einer `\valign`– ein Thema, das ausführlich untersucht werden wird.

Der Zweck der $$\langle$$⁠`Präambelzeile`⁠$$\rangle$$ ist zweifach:

* sie bestimmt die *maximale* Anzahl von Zellen pro Zeile einer `\halign` oder pro Spalte einer `\valign`.
* sie speichert *Zellvorlagen* die verwendet werden können, um die Formatierung oder das Einfügen von Inhalt innerhalb der in der Tabelle enthaltenen Zellen zu automatisieren $$\langle$$⁠`Rumpf`⁠$$\rangle$$. Zellvorlagen sind optional und können „leer“ sein, oder Sie können Zeichen oder Befehle einfügen, die TeX automatisch vor und/oder nach dem tatsächlichen Inhalt bestimmter Zellen in Ihrer Tabelle einfügt. Das erspart Ihnen die Mühe, diese Zeichen oder Befehle in jede Zelle, auf die sie angewendet werden sollen, manuell zu schreiben/einzufügen.

**Hinweis**: eine `\halign` Zeile oder `\valign` Spalte kann weniger Zellen enthalten als das vom $$\langle$$⁠`Präambelzeile`⁠$$\rangle$$ aber nicht mehr als dieses Maximum enthalten, andernfalls erzeugt TeX einen Fehler. Für den Augenblick lassen wir Einzelheiten zu *zyklischen* Präambeln weg.

Fahren wir mit unseren Strukturdiagrammen fort, die $$\langle$$⁠`Präambelzeile`⁠$$\rangle$$ für

* eine `\halign` Tabelle mit maximal $$\mathrm{K}$$ Zellen pro *Zeile*, oder
* eine `\valign` Tabelle mit maximal $$\mathrm{K}$$ Zellen pro *Spalte*

kann wie folgt geschrieben werden:

$$\langle$$⁠Vorlage$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠Vorlage$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠Vorlage$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠Vorlage$${}*\mathrm{K}$$⁠$$\rangle$$

wobei `&` ist das *Ausrichtungs-Tabulatorzeichen* das das Ende einer Zelle und den Beginn der nächsten markiert. Traditionell wird das kaufmännische Und-Zeichen (`&`) [Kategoriecode](/latex/de/weitere-themen/43-table-of-tex-category-codes.md) 4 stattdessen verwendet werden.

Nur zur Erinnerung: Die $$\langle$$⁠`Präambel`⁠$$\rangle$$ kann geschrieben werden $$\langle$$⁠`Präambel`⁠$$\rangle$$=$$\langle$$⁠`Präambelzeile`⁠$$\rangle$$**`\cr`**, oder äquivalent

$$\langle$$⁠`Präambel`⁠$$\rangle$$=$$\langle$$⁠Vorlage$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠Vorlage$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠Vorlage$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠Vorlage$${}*\mathrm{K}$$⁠$$\rangle$$**`\cr`**

#### Struktur jeder Zelle $$\langle$$⁠Vorlage⁠$$\rangle$$

Jede Zelle $$\langle$$⁠Vorlage$${}\_i$$⁠$$\rangle$$ kann wie folgt geschrieben werden:

$$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ wobei:

* $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ ist eine Menge von Zeichen oder Befehlen (Tokens), die TeX automatisch einfügen wird *vor* vom Benutzer bereitgestellten Inhalt für die Zelle $$i$$;
* $$\texttt{#}$$ ist ein Platzhalter, der anzeigt, wo der vom Benutzer bereitgestellte Inhalt in der Zelle erscheinen soll $$i$$. Auch hier ist das `#` Zeichen nur eine *Tradition*, jedes Zeichen mit [Kategoriecode](/latex/de/weitere-themen/43-table-of-tex-category-codes.md) 6 könnte stattdessen verwendet werden. Beachten Sie, dass der Kategoriecode 6 für Makroparameter verwendet wird;
* $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ ist eine Menge von Zeichen oder Befehlen (Tokens), die TeX automatisch einfügen wird *hinter* vom Benutzer bereitgestellten Inhalt für die Zelle $$i$$.

Beachten Sie, dass alle $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ und $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ Schlüsselwörter *optional*: Sie müssen vor oder nach dem Inhalt der Zelle keine Zeichen oder Befehle verwenden.

**Abschließen der** $$\langle$$**⁠Präambel⁠**$$\rangle$$

Schließlich lässt sich mit der obigen Notation die $$\langle$$⁠`Präambel`⁠$$\rangle$$ für

* eine `\halign` Tabelle mit maximal $$\mathrm{K}$$ Zellen pro *Zeile*, oder
* eine `\valign` Tabelle mit maximal $$\mathrm{K}$$ Zellen pro *Spalte*

kann wie folgt geschrieben werden:

$$\langle$$⁠`Präambel`⁠$$\rangle$$=$$\langle$$⁠`Präambelzeile`⁠$$\rangle$$`**\cr**`

oder

$$\langle$$⁠`Präambel`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

**Das** $$\langle$$**⁠Präambel⁠**$$\rangle$$ **und das Zählen von Zeilen und Spalten**

Ein **`\halign`** Tabelle mit einer $$\langle$$⁠`Präambel`⁠$$\rangle$$ die $$\mathrm{K}$$ Zellen angibt, und einer $$\langle$$⁠`Rumpf`⁠$$\rangle$$ die $$\mathrm{N}$$ $$\langle$$⁠`Rumpfzeilen`⁠$$\rangle$$ ergibt eine Tabelle mit $$\mathrm{K}$$ *Spalten* und $$\mathrm{N}$$ *Zeilen*, wie im folgenden Diagramm gezeigt:

![](/files/1802bfdfd0eb13583b96d768a0e53f25a525462c)

Ein **`\valign`** Tabelle mit einer $$\langle$$⁠`Präambel`⁠$$\rangle$$ die $$\mathrm{K}$$ Zellen angibt, und einer $$\langle$$⁠`Rumpf`⁠$$\rangle$$ die $$\mathrm{N}$$ $$\langle$$⁠`Rumpfzeilen`⁠$$\rangle$$ ergibt eine Tabelle mit $$\mathrm{K}$$ *Zeilen* und $$\mathrm{N}$$ *Spalten*, wie im folgenden Diagramm gezeigt:

![](/files/b4560ff56b43b97a502161bfadaeb2c2950c3dfd)

### Genug Theorie, jetzt ein paar Beispiele!

Wie wir später noch im Detail sehen werden, überprüft TeX beim Verarbeiten des Tabelleninhalts – der Tabellenzellen im [$$\langle$$⁠`Rumpf`⁠$$\rangle$$](#body)– es prüft das Vorhandensein von Zellvorlagen, die in der $$\langle$$⁠`Präambel`⁠$$\rangle$$definiert wurden, da TeX nach Vorlagen-Tokens sucht, die vor und/oder nach dem Inhalt des Benutzers eingefügt werden sollen. Die folgenden minimalen Beispiele demonstrieren die Verwendung von Zellvorlagen $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ in einer `\halign` und `\valign` Tabelle.

#### Eine \halign-Tabelle mit Zellvorlagen

Das folgende Beispiel demonstriert eine `\halign` Tabelle, die eine Zellvorlage verwendet, um automatisch doppelte Anführungszeichen um den Inhalt der ersten Zelle jeder Zeile einzufügen: also eine Vorlage, die jede Zelle in der ersten Spalte betrifft:

```latex
\documentclass{article}
\usepackage{parskip} % Setze \parindent auf 0pt
Wählen Sie eine praktisch kleine Seitengröße
\usepackage[paperheight=10cm,paperwidth=12cm,textwidth=8cm]{geometry}
\setlength{\tabskip}{20pt} % Vergrößere den Abstand zwischen den \halign-Spalten
\begin{document}
\pagestyle{empty}

Hier ist eine \verb|\halign|-Tabelle \textit{ohne} Zellvorlagen:

\halign{
% Nichts vor oder nach jedem '#' in der <preamble>
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}

Hier ist dieselbe \verb|\halign|-Tabelle, jedoch mit automatisch zur ersten Zelle jeder Zeile hinzugefügten doppelten Anführungszeichen; das heißt, sie betrifft jede Zelle in der ersten Spalte:

\halign{
% Anführungszeichen-Vorlagen in der Präambel:
``#''&#&#\cr % Doppelte Anführungszeichen vor und nach dem ersten #
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\end{document}
```

[Öffnen Sie dieses Beispiel in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=halign+example+of+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D10cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B20pt%7D+%25+Space+out+the+%5Chalign+columns%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A+%0A%0A%5Chalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Chalign%7C+table+but+with+double+quotes+automatically+added+to+the+first+cell+in+each+row%3B+i.e.%2C+it+affects+every+cell+in+the+first+column%3A+%0A%0A%5Chalign%7B%0A%25+Quotation+templates+in+the+preamble%3A%0A%60%60%23%27%27%26%23%26%23%5Ccr+%25+Double+quote+marks+before+and+after+first+%23%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

Dieses Beispiel erzeugt die folgende Ausgabe:

![](/files/183262ecd5cad2fcc1321e4c0ec3d7c302ddbb6a)

Die folgende Grafik ist eine kommentierte Version der `\halign` Tabelle, die durch das obige Beispiel erzeugt wurde; hier vergleichen wir die „formale“ Struktur einer dreizelligen $$\langle$$⁠`Präambel`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

mit der tatsächlichen $$\langle$$⁠`Präambel`⁠$$\rangle$$ von ` ``#''&#&#**\cr** `, wobei das Vorhandensein oder Fehlen von Zellvorlagen hervorgehoben wird:

![](/files/3b2b1ff7d650e292ab2d1581ff3d9a41736f415d)

#### Eine \valign-Tabelle mit Zellvorlagen

Das folgende Beispiel demonstriert eine `\valign` Tabelle, die für jede Zelle eine Vorlage verwendet, um automatisch Ziffern um den Inhalt des Benutzers herum einzufügen.

```latex
\documentclass{article}
\usepackage{parskip} % Setze \parindent auf 0pt
Wählen Sie eine praktisch kleine Seitengröße
\usepackage[paperheight=14cm,paperwidth=12cm,textwidth=10cm]{geometry}
\setlength{\tabskip}{8pt} % Vergrößere den Abstand zwischen den \valign-Zeilen
\begin{document}
\pagestyle{empty}

Hier ist eine \verb|\valign|-Tabelle \textit{ohne} Zellvorlagen:

\begingroup
\hsize=25pt
\valign{
% Nichts vor oder nach jedem '#' in
% der <preamble>
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

Hier ist dieselbe \verb|\valign|-Tabelle, aber mit Zellvorlagen, um automatisch Ziffern in jede Zelle einzufügen:

\begingroup
\hsize=25pt
\valign{
% Ziffern vor und nach jedem '#' in
% der <preamble>
1#2&3#4&5#6\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup
\end{document}
```

[Öffnen Sie dieses Beispiel in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+valign+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%25+Space+out+the+%5Cvalign+rows%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+%0A%25+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+using+cell+templates+to+automatically+insert+digits+into+every+cell%3A+%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Digits+inserted+before+and+after+every+%27%23%27+in%0A%25+the+%3Cpreamble%3E%0A1%232%263%234%265%236%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Dieses Beispiel erzeugt die folgende Ausgabe:

![](/files/e40a2310e69b4600c90ce688adb869067c90d228)

Die folgende Grafik ist eine kommentierte Version der `\valign` Tabelle, die durch das obige Beispiel erzeugt wurde; hier vergleichen wir die „formale“ Struktur einer dreizelligen $$\langle$$⁠`Präambel`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

mit der tatsächlichen $$\langle$$⁠`Präambel`⁠$$\rangle$$ von `1#2&3#4&5#6**\cr**`, wobei die Verwendung von Zellvorlagen hervorgehoben wird $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$:

![](/files/48c11fe7a2be67578246f8804c2386fc43deb365)

Beachten Sie, wie die Vorlage für Zelle $$i$$ ($$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$) auf die $$i$$n-ten Zelle in jeder `\valign` Spalte angewendet wird, wodurch alle Zellen der $$i$$n-ten *Zeile* betroffen sind.

#### Text mithilfe von Zellvorlagen formatieren

Das nächste Beispiel verwendet die folgende $$\langle$$⁠`Präambel`⁠$$\rangle$$ (Zellvorlagen), um den in jeder Zeile oder Spalte enthaltenen Text zu formatieren:

`\textbf{#}&\textit{#}&\texttt{#}\cr`

Wenn wir dies vergleichen $$\langle$$⁠`Präambel`⁠$$\rangle$$ mit unserer „formalen“ Struktur einer dreizelligen $$\langle$$⁠`Präambel`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

sehen wir Folgendes:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$=`\textbf{`

$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$=`\textit{`

$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$=`\texttt{`

$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$=`}`

Beachten Sie, dass diese Zellvorlagen, wie `\textbf{#}` Makros mit einem einzigen Parameter ähneln (dem Zellinhalt).

```latex
Eine \verb|\valign|-Tabelle mit mithilfe von Zellvorlagen formatiertem Text:

\begingroup
\hsize=25pt
\valign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

Eine \verb|\halign|-Tabelle mit mithilfe von Zellvorlagen formatiertem Text:

\halign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
```

[Öffnen Sie dieses Beispiel in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Styling+with+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+or+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AA+%5Cverb%7C%5Cvalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AAn+%5Cverb%7C%5Chalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Chalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

Dieses Beispiel erzeugt die folgende Ausgabe:

![](/files/46f1415867fb602d5cd4fad1fdce13cfc4da4780)

## Mehr Details zur Tabelle $$\langle$$⁠Rumpf⁠$$\rangle$$

Im Abschnitt [Einführung in die Tabelle $$\langle$$⁠`Präambel`⁠$$\rangle$$ und $$\langle$$⁠`Rumpf`⁠$$\rangle$$](#preamble) sahen wir, wie, wenn wir vorübergehend `\noalign`, das $$\langle$$⁠`Rumpf`⁠$$\rangle$$ einer `\halign` oder `\valign` Tabelle aus mehreren Zeilen besteht, die jeweils bezeichnet werden $$\langle$$⁠Rumpfzeile⁠$${}\_j$$⁠$$\rangle$$, wobei:

* jede $$\langle$$⁠Rumpfzeile⁠$${}\_j$$⁠$$\rangle$$ mit dem `\cr` Befehls
* jede $$\langle$$⁠Rumpfzeile⁠$${}\_j$$⁠$$\rangle$$ einer `\halign` ist eine Tabellenzeile
* jede $$\langle$$⁠Rumpfzeile⁠$${}\_j$$⁠$$\rangle$$ einer `\valign` ist eine Tabellenspalte

Die Abfolge von Zeilen, $$\langle$$⁠Rumpfzeile⁠$${}\_j$$⁠$$\rangle$$, wobei $$j=1\ldots\mathrm{N}$$, ergibt $$\mathrm{N}$$ Zeilen einer `\halign` oder $$\mathrm{N}$$ Spalten für eine `\valign`. Wie in der folgenden Abbildung zusammengefasst, spezifiziert eine allgemeine $$\langle$$⁠`Präambel`⁠$$\rangle$$ wie

$$\langle$$⁠`Präambel`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

Zellvorlagen für maximal $$\mathrm{K}$$ Zellen in jeder der $$\mathrm{N}$$ $$\langle$$⁠`Rumpfzeile`⁠$$\rangle$$ Einträge in den $$\langle$$⁠`Rumpf`⁠$$\rangle$$:

![](/files/a8a70ddb38758ba14117b4ee5a20e8dcac08547f)

### Die Struktur jeder $$\langle$$⁠Rumpfzeile⁠$${}\_j$$⁠$$\rangle$$

Jede Zeile $$\langle$$⁠Rumpfzeile⁠$${}\_j$$⁠$$\rangle$$ der Tabelle $$\langle$$⁠Rumpf⁠$$\rangle$$ enthält Inhalt für bis zu $$\mathrm{K}$$ Zellen — bestimmt durch die Tabellenpräambel $$\langle$$⁠Präambel⁠$$\rangle$$— und hat die allgemeine Form:

$$\langle$$⁠Rumpfzeile⁠$${}\_j$$⁠$$\rangle$$=$$\langle$$⁠Zelle$${}\_1$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$⁠Zelle$${}\_2$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$⁠Zelle$${}*3$$⁠$$\rangle$$$$\texttt{&}$$$$\cdots$$$$\texttt{&}$$$$\langle$$⁠Zelle$${}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

wobei:

* $$\langle$$⁠Zelle$${}\_i$$⁠$$\rangle$$ stellt den Inhalt des Benutzers für die $$i$$n-ten Zelle in einer bestimmten $$\langle$$⁠Rumpfzeile⁠$${}\_j$$⁠$$\rangle$$
* die **`&`** Zeichen wird die *Ausrichtungstabulator* (derselbe wie im $$\langle$$⁠Präambel⁠$$\rangle$$) der das Ende einer Zelle und den Beginn der nächsten signalisiert. Auch hier ist die Verwendung von **`&`** lediglich Tradition (Konvention), da jedes Zeichen mit [Kategoriecode](/latex/de/weitere-themen/43-table-of-tex-category-codes.md) 4 stattdessen verwendet werden.

Obwohl jede $$\langle$$⁠Rumpfzeile⁠$${}\_j$$⁠$$\rangle$$ eine maximale Anzahl von $$\mathrm{K}$$ Zellen (bestimmt durch die $$\langle$$⁠Präambel⁠$$\rangle$$) enthalten kann, können sie *weniger* als $$\mathrm{K}$$ Zellen und jede $$\langle$$⁠Zelle$${}\_i$$⁠$$\rangle$$ in $$\langle$$⁠Rumpfzeile⁠$${}\_j$$⁠$$\rangle$$ kann leer sein.

Das folgende Beispiel demonstriert eine $$\langle$$⁠Präambel⁠$$\rangle$$ von `#&#&#&#&#\cr` was ein Maximum von 5 Zellen pro $$\langle$$Inhaltszeile$$\rangle$$; die gesetzten Tabellen enthalten jedoch Zeilen mit weniger als 5 Zellen:

```latex
Eine \verb|\valign|-Tabelle mit 1 bis 5 Zellen pro \textit{Spalte}:

\begingroup
% \hsize steuert die Spaltenbreiten der \valign (Größe der gesetzten Zeilen).
\hsize=40pt
\fbox{\valign{
% Verwenden Sie eine Präambel, die 5 Zellen pro Spalte zulässt
% Die meisten Spalten liefern keinen Inhalt für 5 Zellen
#&#&#&#&#\cr% 5 Zellen pro Spalte
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}
\endgroup

% Hinweis: Aus später erläuterten Gründen
% muss die \halign in eine \vbox gesetzt werden
Eine \verb|\halign|-Tabelle mit 1 bis 5 Zellen pro \textit{Zeile}:

\fbox{
\vbox{\halign{
% Verwenden Sie eine Präambel, die 5 Zellen pro Zeile zulässt
% Die meisten Zeilen liefern keinen Inhalt für 5 Zellen
#&#&#&#&#\cr % 5 Zellen pro Zeile
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[Öffnen Sie dieses Beispiel in Overleaf](/latex/de/ausfuhrliche-artikel/15-how-do-tex-engines-typeset-tables-2.md)

Dieses Beispiel erzeugt die folgende Ausgabe:

![](/files/cd7d4d1ad56717ed4716fb5008ed7ec56cd66c49)

Das nächste `\halign` Beispiel zeigt eine unterschiedliche Anzahl von Zellen pro Zeile und die Möglichkeit, dass Zellen leer sein können — beachten Sie, wie leere Zellen durch aufeinanderfolgende **`&`** Zeichen in der Tabelle erzeugt werden:

```latex
Eine \verb|\halign|-Tabelle mit einigen leeren Zellen — beachten Sie, dass in der Tabelle \(\langle\texttt{body}\rangle\) aufeinanderfolgende \texttt{\&}-Zeichen vorkommen:

\fbox{
\vbox{\halign{
% Verwenden Sie eine Präambel, die 5 Zellen pro Zeile zulässt
% Die meisten Zeilen liefern keinen Inhalt für 5 Zellen
#&#&#&#&#\cr % 5 Zellen pro Zeile
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&&\(\mathrm{Cell}{}_3\)\cr
&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&&&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[Öffnen Sie dieses Beispiel in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Empty+cells+Number+of+cells+per+row\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+and+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Cbegin%7Bdocument%7D%0AAn+%5Cverb%7C%5Chalign%7C+table+with+some+empty+cells---note+there+are+consecutive+%5Ctexttt%7B%5C%26%7D+characters+in+the+table+%5C%28%5Clangle%5Ctexttt%7Bbody%7D%5Crangle%5C%29%3A%0A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%25+Use+a+preamble+that+allows+for+5+cells+per+row%0A%25+Most+rows+don%27t+provide+content+for+5+cells%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+5+cells+per+row%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%5Ccr+%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%5Ccr%0A%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_4%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_5%5C%29%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Dieses Beispiel erzeugt die folgende Ausgabe:

![](/files/19bc614cc025a69c17980cc20f2a2a3df388432a)

### Beim Satz von Tabellen ist an & und # nichts Besonderes

TeX’ Verwendung der Zeichen `&` und `#` beim Setzen von `\halign`- oder `\valign`-basierten Tabellen ist eine Tradition, die ihren Ursprung in Knuths ursprünglichen Plain-TeX-Makros hat. Es ist durchaus möglich, andere Zeichen als `&` und `#` zu verwenden, indem man den bevorzugten Ersatzzeichen die entsprechenden Kategoriecodes zuweist, wie das folgende Beispiel zeigt:

* Ersetzen von `&` durch `@` durch Zuweisung von `@` zu Kategoriecode 4
* Ersetzen von `#` durch `|` durch Zuweisung von `|` zu Kategoriecode 6 (der für Makroparameter verwendet wird)

Kategorieänderungen bleiben lokal durch Verwendung von `\begingroup` und `\endgroup`:

```latex
\documentclass{article}
\begin{document}
\begingroup
\catcode`@=4
\catcode`|=6
\halign{
|@|@|\cr
A@B@C\cr
D@E@F\cr
}
\endgroup
\end{document}
```

[Öffnen Sie dieses Beispiel in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tables+and+category+codes\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegingroup%0A%5Ccatcode%60%40%3D4%0A%5Ccatcode%60%7C%3D6%0A%5Chalign%7B%0A%7C%40%7C%40%7C%5Ccr%0AA%40B%40C%5Ccr%0AD%40E%40F%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

## Die \noalign-Anweisung wieder einführen

TeX-Engines stellen die eingebaute (primitive) `\noalign` von fontspec konfiguriert:

`\noalign{`$$\langle$$⁠`Tokens`⁠$$\rangle$$`}`

wobei $$\langle$$⁠`Tokens`⁠$$\rangle$$ sind Zeichen und/oder TeX-/LaTeX-Befehle. Der `\noalign` Befehl ist ausschließlich für die Verwendung innerhalb einer `\halign` oder `\valign` Tabelle: Die Verwendung außerhalb davon erzeugt einen Fehler.

Der Zweck von `\noalign` besteht darin, das „Einfügen“ von Text und TeX-/LaTeX-Befehlen zu ermöglichen *zwischen* den Zeilen einer `\halign` Tabelle oder den Spalten einer `\valign` Tabelle. Die häufigste Verwendung von `\noalign` ist das Erzeugen von Tabellenlinien:

* *horizontale* Linien zwischen `\halign` Tabellenzeilen
* *vertikale* Linien zwischen `\valign` Tabellenspalten

Beachten Sie Folgendes:

* die `\noalign` Befehls ist ***nicht abgeschlossen durch den\*\*\*\*****&#x20;****`\cr`****&#x20;****\*\*\*\*Befehl***
* der Satz von Befehlen, die innerhalb von `\noalign{...}` zulässig sind, hängt davon ab, ob es in der $$\langle$$⁠`Rumpf`⁠$$\rangle$$ einer `\halign` oder `\valign` Tabelle verwendet wird (d. h. im vertikalen oder horizontalen Modus).

Wir können nun sagen, dass die Tabelle $$\langle$$⁠`Rumpf`⁠$$\rangle$$ von `\halign` oder `\valign` aus einzelnen Zeilen bestehen kann $$\langle$$⁠Rumpfzeile⁠$${}\_i$$⁠$$\rangle$$`\cr` durchsetzt mit `\noalign` Befehlen; eine von vielen Möglichkeiten/Kombinationen könnte sein:

`\noalign{`$$\langle$$⁠`Tokens`⁠$$\rangle$$`}` $$\langle$$⁠Rumpfzeile⁠$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠Rumpfzeile⁠$${}\_2$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`mehr Tokens`⁠$$\rangle$$`}` $$\langle$$⁠Rumpfzeile⁠$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠Rumpfzeile⁠$${}*\mathrm{N}$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`andere Tokens`⁠$$\rangle$$`}`

### Beispiel mit \noalign

Wir werden uns später in dieser Artikelreihe andere Anwendungsfälle ansehen, aber hier ist ein einfaches Beispiel, das die Erzeugung von Tabellenlinien mittels `\noalign`:

```latex
\setlength{\tabskip}{5pt}

Verwendung von \verb|\noalign|, um horizontale Linien zwischen Zeilen einer \verb|\halign|-Tabelle zu platzieren:
\vspace{6pt}

\halign{%
#&#&#&#&#\cr
\noalign{\hrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\hrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\hrule}
}

Verwendung von \verb|\noalign|, um vertikale Linien zwischen Spalten einer \verb|\valign|-Tabelle zu platzieren:
\vspace{6pt}

\begingroup % Änderungen an \parindent und \hsize lokal halten
\parindent=0pt
\hsize=50pt
\valign{%
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[Öffnen Sie dieses Beispiel in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+the+noalign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+horizontal+rules+between+rows+of+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Chalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D%0A%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+vertical+rules+between+columns+of+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup+%25+keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Cparindent%3D0pt%0A%5Chsize%3D50pt%0A%5Cvalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Dieses Beispiel erzeugt die folgende Ausgabe:

![](/files/2cbe898705e748ad68d25abf6b9e586e0c804bb1)

## \tabskip erneut betrachtet

Wir werden uns den `\tabskip` Befehl genauer ansehen, aufbauend auf der [Einführung im vorherigen Abschnitt](#tabskip).

Das `\tabskip` Befehl setzt den Wert einer speziellen Form von „Abstand“ (Glue), der *ausschließlich* beim Setzen von Tabellen verwendet wird: Sein Zweck ist es, den Abstand zwischen Tabellenzeilen oder -spalten bereitzustellen:

* für `\halign` Tabellen: `\tabskip` Glue wird vor und nach der Tabelle (d. h. links und rechts) sowie zwischen den Tabellenspalten eingefügt
* für `\valign` Tabellen: `\tabskip` Glue wird vor und nach der Tabelle (d. h. oberhalb und unterhalb) sowie zwischen den Tabellenzeilen eingefügt

Der Wert von `\tabskip` kann mit dem LaTeX- `\setlength` von fontspec konfiguriert:

`\setlength{\tabskip}{`$$\langle$$⁠`Glue-Wert`⁠$$\rangle$$`}`

wobei $$\langle$$⁠`Glue-Wert`⁠$$\rangle$$ kann sein:

* eine feste Länge wie `5pt`, `3mm`, oder
* ein endlicher flexibler Glue wie `3pt plus 2pt minus 1pt`, oder
* ein unendlich flexibler Glue wie `0pt plus1fill`.

Sie können auch direkt `\tabskip` (unter Umgehung von `\setlength`) setzen, indem Sie schreiben

`\tabskip`=$$\langle$$⁠`Glue-Wert`⁠$$\rangle$$

Allerdings wirkt sich jede Änderung des Werts von `\tabskip` Glue nur auf den Tabellenabstand aus, wenn diese Änderung:

* vorgenommen *vor* die `\halign` oder `\valign` Befehl verarbeitet werden soll, oder
* innerhalb der Tabelle vorgenommen $$\langle$$⁠`Präambel`⁠$$\rangle$$

Versuche, `\tabskip` Werte innerhalb des Tabelleninhalts (Zellen in der Tabelle $$\langle$$⁠`Rumpf`⁠$$\rangle$$) *werden nicht* den Abstand von `\halign` Tabellenspalten oder `\valign` Tabellenzeilen verändern. Der Grund für dieses Verhalten von `\tabskip` liegt in der Rolle, die $$\langle$$⁠`Präambel`⁠$$\rangle$$ beim Setzen von Tabellen spielt — Prozesse, die wir später noch im Detail untersuchen werden.

### Sehen heißt glauben

Um das Vorhandensein verschiedener Arten von Abstand/Glue zu veranschaulichen, die beim Setzen von Tabellen verwendet werden, insbesondere

* `\tabskip` Glue
* `\baselineskip` Glue
* manuelles Kerning (`\kern`)

Overleaf hat ein auf LuaTeX basierendes Projekt vorbereitet, um die Bestandteile einer Tabelle farblich zu markieren. LuaTeX wurde gewählt, weil es eine Verarbeitung auf niedriger Ebene der internen Daten/Strukturen gesetzter Tabellen ermöglicht, aber wir werden diese Details hier nicht untersuchen.

Hier sind einige Beispiele, die verschiedene Anwendungen von `\tabskip`zeigen. Zu jedem Beispiel zeigen wir die tatsächliche Ausgabe und die von LuaTeX erzeugte farbig markierte Version.

### \tabskip-Beispiel 1

Lassen Sie uns die Verwendung von `\tabskip` in einer `\halign` und `\valign` Tabelle untersuchen. Wir zeigen die tatsächlich gesetzten Tabellen mit einem Rahmen, um ihre Größe und ihren Abstand zu veranschaulichen, zusammen mit annotierten Grafiken, die farbig markierte Versionen enthalten und die Größe der verschiedenen Glues/Abstände in jeder Tabelle deutlich zeigen.

Zunächst der `\halign`:

```latex
% Um die Ausdehnung der Tabelle zu veranschaulichen, setzen wir einen Rahmen darum
\setlength{\fboxsep}{0pt} % Eng anliegende Rahmen verwenden

% Hier setzen wir \tabskip „direkt“
\tabskip5pt % Setzen Sie den anfänglichen \tabskip-Wert außerhalb der Tabelle

% Um einen Rahmen um die Tabelle zu setzen, muss sie in einer TeX-Box gespeichert werden.
% Eine \halign muss in eine \vbox gesetzt werden, weil \halign
% in einem „vertikalen Modus“ verarbeitet werden muss: Eine \hbox funktioniert nicht, weil
% diese in einem „horizontalen Modus“ verarbeitet wird

\fbox{\vbox{\halign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
```

[Öffnen Sie dieses Beispiel in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tabskip+glue+in+an+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+To+visualize+the+table%27s+extent+we%27ll+put+a+border+around+it+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%0A%25+Here+we+set+%5Ctabskip+%22directly%22%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+To+put+a+border+around+the+table+it+has+to+be+saved+to+a+TeX+box.%0A%25+An+%5Chalign+has+to+be+placed+in+a+%5Cvbox+because+%5Chalign+must+be+%0A%25+processed+in+a+%22vertical+mode%22%3A+an+%5Chbox+will+not+work+because%0A%25+that+is+processed+in+a+%22horizontal+mode%22%0A%0A%5Cfbox%7B%5Cvbox%7B%5Chalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Dieses Beispiel erzeugt die folgende Ausgabe:

![](/files/7837ca5357a2b38d77ade62c450b818d05a04515)

Die nächste Grafik ist eine größere, farbig markierte und annotierte Version der im vorherigen Beispiel erzeugten Tabelle:

![](/files/33e1e04f1f0f3571970d99df832f16c80333beb1)

Es gibt 4 Vorkommen des `\tabskip` Befehls, jedes entspricht einer bestimmten Stelle des Abstands innerhalb der Tabelle:

1. `\tabskip5pt` wird außerhalb der Tabelle verwendet und setzt den `\tabskip` Wert, der vor der ersten Zelle in jeder Zeile angewendet wird (links davon).
2. `\tabskip10pt` ist in der ersten Zellvorlage der $$\langle$$⁠`Präambel`⁠$$\rangle$$ was den Abstand zwischen $$\langle$$⁠Zelle$${}\_1$$⁠$$\rangle$$ und $$\langle$$⁠Zelle$${}\_2$$⁠$$\rangle$$ jeder Zeile beeinflusst.
3. `\tabskip15pt` ist in der zweiten Zellvorlage der $$\langle$$⁠`Präambel`⁠$$\rangle$$ was den Abstand zwischen $$\langle$$⁠Zelle$${}\_2$$⁠$$\rangle$$ und $$\langle$$⁠Zelle$${}\_3$$⁠$$\rangle$$ jeder Zeile beeinflusst.
4. `\tabskip20pt` ist in der dritten und letzten Zellvorlage der $$\langle$$⁠`Präambel`⁠$$\rangle$$ gesetzt, was den nach $$\langle$$⁠Zelle$${}\_3$$⁠$$\rangle$$folgenden Abstand beeinflusst, der letzten Zelle jeder Zeile.

Als Nächstes der `\valign`

```latex
\setlength{\fboxsep}{0pt} % Eng anliegende Rahmen verwenden
\tabskip5pt % Setzen Sie den anfänglichen \tabskip-Wert außerhalb der Tabelle

% Änderungen an \hsize lokal halten (in einer Gruppe)
\begingroup
% \hsize bestimmt die Spaltenbreiten von \valign
\setlength{\hsize}{50pt}
% Da \valign in eine \vbox oder \hbox gesetzt werden kann, können wir
% \fbox direkt verwenden
\fbox{\valign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
E&E&F\cr
G&H&I\cr
}}
\endgroup
```

[Öffnen Sie dieses Beispiel in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+Keep+changes+to+%5Chsize+local+%28in+a+group%29%0A%5Cbegingroup%0A%25+%5Chsize+determines+the+%5Cvalign+column+widths%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D+%0A%25+Because+%5Cvalign+can+be+placed+in+a+%5Cvbox+or+%5Chbox+we+can+use+%0A%25+%5Cfbox+directly%0A%5Cfbox%7B%5Cvalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AE%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Dieses Beispiel erzeugt die folgende Ausgabe:

![](/files/cf16cc1af4d8e1aa761a0e77c6c724d87b893c1e)

Auch hier ist die nächste Grafik eine größere, farbig markierte und annotierte Version der im vorherigen Beispiel erzeugten Tabelle:

![](/files/d7d09cf0b62db96be59bc30b27b7f2b3e02a6860)

Wie beim `\halign` Beispiel gibt es 4 Vorkommen des `\tabskip` Befehls. Bei einer `\valign` Tabelle wird der `\tabskip` zwischen die Tabellenzeilen eingefügt:

1. `\tabskip5pt` wird außerhalb der Tabelle verwendet und setzt den `\tabskip` Wert, der vor der ersten Zelle in jeder Spalte angewendet wird (oberhalb davon).
2. `\tabskip10pt` ist in der ersten Zellvorlage der $$\langle$$⁠`Präambel`⁠$$\rangle$$ was den Abstand zwischen $$\langle$$⁠Zelle$${}\_1$$⁠$$\rangle$$ und $$\langle$$⁠Zelle$${}\_2$$⁠$$\rangle$$ jeder Spalte.
3. `\tabskip15pt` ist in der zweiten Zellvorlage der $$\langle$$⁠`Präambel`⁠$$\rangle$$ was den Abstand zwischen $$\langle$$⁠Zelle$${}\_2$$⁠$$\rangle$$ und $$\langle$$⁠Zelle$${}\_3$$⁠$$\rangle$$ jeder Spalte.
4. `\tabskip20pt` ist in der dritten und letzten Zellvorlage der $$\langle$$⁠`Präambel`⁠$$\rangle$$ gesetzt, was den nach $$\langle$$⁠Zelle$${}\_3$$⁠$$\rangle$$, der letzten Zelle jeder Spalte.

**Zusammenfassung/Schlussfolgerungen**

* In einem `\halign` Tabelle wird der `\tabskip` wird Glue links und rechts von jeder Zelle einer Zeile platziert und spreizt so die Tabellenspalten auseinander.
* In einer `\valign` Tabelle wird der `\tabskip` wird Glue oberhalb und unterhalb jeder Zelle in einer Spalte platziert und spreizt so die Tabellenzeilen auseinander.

### \tabskip und \noalign

#### Verwendung einer \halign

Das folgende `\halign` Beispiel verwendet `\tabskip` Glues und demonstriert außerdem den `\noalign` Befehl, indem er ihn verwendet, um mit Abstand versehene Linien oberhalb und unterhalb der Zeilen einer `\halign` Tabelle zu platzieren. Diese Linien werden mit dem `\hrule` (primitiven) Befehl zusammen mit dem durch `\kern`:

```latex
\setlength{\tabskip}{5pt} % \tabskip außerhalb der Tabelle setzen

\halign{
#&#&#&#&#\cr % Die <preamble>
\noalign{\hrule\kern2pt} % Mit Abstand versehene Linie vor Zeile 1
1&2&3&4&5\cr % Zeile 1
\noalign{\kern2pt\hrule\kern2pt} % Mit Abstand versehene Linie zwischen Zeile 1/2
6&7&8&9&10\cr % Zeile 2
\noalign{\kern2pt\hrule\kern2pt} % Mit Abstand versehene Linie zwischen Zeile 2/3
11&12&13&14&15\cr % Zeile 3
16&17&18&19&20\cr % Zeile 4—keine Linien zwischen den Zeilen 3/4
\noalign{\kern2pt\hrule} % Abstandslinie am Tabellenende
}
```

[Öffnen Sie dieses Beispiel in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D+%25+Set+%5Ctabskip+outside+of+the+table%0A%0A%5Chalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+The+%3Cpreamble%3E%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+before+row+1%0A1%262%263%264%265%5Ccr+%25+Row+1%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+1%2F2+%0A6%267%268%269%2610%5Ccr+%25+Row+2%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+2%2F3+%0A11%2612%2613%2614%2615%5Ccr+%25+Row+3%0A16%2617%2618%2619%2620%5Ccr+%25+Row+4---no+rules+between+rows+3%2F4%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D+%25+Space+rule+at+table+end%0A%7D%0A%5Cend%7Bdocument%7D)

Dieses Beispiel erzeugt die unten gezeigte Tabelle, die zusätzlich annotiert wurde, um den (La)TeX-Code sowie die Zahlen (1) bis (4) wiederzugeben und die `\noalign` Befehle mit ihren enthaltenen Linien und Kerns sowie der entsprechenden gesetzten Ausgabe aufzulisten:

![](/files/c93b5be99ea0a55bbffb59f932a2dc1861079f6d)

Die folgende Grafik zeigt eine farbig markierte Version der Tabelle, beschriftet, um die verschiedenen Abstände/Glues in der Tabelle zu zeigen:

![](/files/027bcc2b21b7fb74e1d83b813880830cc0bba19c)

Beachten Sie Folgendes:

* die Verwendung von `\noalign` zum Einfügen von Linien zwischen bestimmten Zeilen und die manuelle Verwendung von `\kern` Werten, um vor/nach den Linien etwas Abstand zu setzen. TeX-Engines fügen keinen `\baselineskip` Glue nach einer gesetzten Linie ein, weshalb Abstand manuell mit `\kern` eingefügt wird (andere Abstandsbefehle könnten verwendet werden);
* `\baselineskip` Glue wurde automatisch zwischen den Zeilen 3 und 4 eingefügt.

#### Verwendung einer \valign

Das folgende `\valign` Beispiel verwendet dieselben Daten wie die vorherige `\halign`:

```latex
\begingroup
\setlength{\parindent}{10pt}
\setlength{\hsize}{50pt}
\setlength{\tabskip}{5pt}
\valign{
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule\kern2pt}
11&12&13&14&15\cr
16&17&18&19&20\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[Öffnen Sie dieses Beispiel in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Cbegingroup%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A11%2612%2613%2614%2615%5Ccr%0A16%2617%2618%2619%2620%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Dieses Beispiel erzeugt die unten gezeigte Tabelle, die zusätzlich annotiert wurde, um den (La)TeX-Code sowie die Zahlen (1) bis (4) wiederzugeben und die `\noalign` Befehle mit ihren enthaltenen Linien und Kerns sowie der entsprechenden gesetzten Ausgabe aufzulisten:

![](/files/96dec692fed765cd7a7a55df6c84662033d21dc6)

![](/files/680efba3ce76096abaae0a9774f76299043c6522)

### Eine \valign-Tabelle mit Textzeilen

Das nächste Beispiel

```latex
\setlength{\tabskip}{5pt}
\begingroup % Änderungen an \parindent und \hsize lokal halten
\setlength{\parindent}{10pt}
\setlength{\hsize}{75pt}
\valign{
#&#&#\cr
\noalign{\vrule\kern5pt}
\TeX{} kann sehr komplexe
Tabellen.&Hier ist noch etwas zusätzlich
Text.&Und schließlich eine zusätzliche Zeile
in dieser Spalte.\cr
\noalign{\kern5pt\vrule\kern5pt}
A&B&C\cr
\noalign{\kern5pt\vrule\kern5pt}
D&E&F\cr
G&H&I\cr
\noalign{\kern5pt\vrule}
}
\endgroup
```

[Öffnen Sie dieses Beispiel in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+valign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D16cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cbegingroup+%25+Keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B75pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern5pt%7D%0A%5CTeX%7B%7D+can+typeset+very+complex%0Atables.%26Here%27s+a+bit+of+extra+%0Atext.%26And%2C+finally%2C+an+extra+line%0Ain+this+column.%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AA%26B%26C%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Dieses Beispiel erzeugt die folgende Ausgabe:

## Zeilenbreiten und Spaltenhöhen festlegen

## Mehr über die Tabelle $$\langle$$⁠Präambel⁠$$\rangle$$


---

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