> 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/47-tex-tables-how-tex-calculates-spanned-column-widths.md).

# TeX-Tabellen: Wie TeX die Breiten überspannter Spalten berechnet

## Das Ziel dieses Artikels

In diesem Artikel untersuchen wir, wie $$\mathrm\TeX$$ die Breiten von Tabellenspalten berechnet, wenn Tabellen Einträge enthalten (z. B. Tabellenüberschriften), die sich über mehrere Spalten erstrecken (z. B. unter Verwendung von $$\mathrm\TeX$$ Primitiven `\omit` und `\span`). Unter Verwendung einer einfachen [„Referenz“-Tabelle](#reference-table) als Ausgangspunkt erstellen wir eine Reihe von Beispielen – abgeleitet von dieser Referenztabelle –, indem wir verschiedene Einträge anpassen, um über mehrere Spalten reichende Spalten zu erzeugen. Durch die Untersuchung der Auswirkungen dieser Änderungen können wir beginnen, ein Verständnis des zugrunde liegenden Algorithmus zu entwickeln, den $$\mathrm\TeX$$ verwendet, um die Breite von über mehrere Spalten reichenden Spalten zu berechnen.

### Verwenden von $$\mathrm\TeX$$ nicht $$\mathrm\LaTeX$$

Um zu *wie* $$\mathrm\TeX$$ untersuchen und zu erklären, wie $$\mathrm\LaTeX$$ auf eines der wunderbaren Tabellenpakete verzichten und zu grundlegenden, niedrigstufigen (primitiven) Tabellenerzeugungsbefehlen zurückkehren: insbesondere, `\halign{...}`, `\span` und `\omit`. [Vorhandene $$\mathrm\TeX$$/$$\mathrm\LaTeX$$ Tabellenpakete](https://ctan.org/topic/table) sind natürlich unverzichtbare Produktivitätswerkzeuge und bieten eine Fülle äußerst nützlicher Funktionen, die es Benutzern ermöglichen, schnell eine große Bandbreite tabellarischer Materialien mit $$\mathrm\LaTeX$$zu erzeugen. Diese Pakete stellen ein wesentliches „Makro-Gerüst“ bereit, das um $$\mathrm\TeX$$s Verhalten auf niedriger Ebene herum konstruiert ist, und ihre Entwickler bieten sehr willkommene Abstraktionen und Isolationsschichten, die sich um die zugrunde liegenden Komplexitäten kümmern. Viele dieser Pakete sind wahrhaft unglaubliche Leistungen komplexer $$\mathrm\TeX$$ Programmierung: Wir sollten alle dankbar sein, dass sie existieren und uns davor bewahren, rohes $$\mathrm\TeX$$!

Der eigentliche Algorithmus, den $$\mathrm\TeX$$ verwendet, um die Breiten von über mehrere Spalten reichenden Spalten zu berechnen, wird auf Seite 245 des [$$\mathrm\TeX\text{book}$$](https://www.amazon.co.uk/TeXbook-Donald-E-Knuth/dp/0201134489) erklärt und mit weiteren Details in Abschnitt 801 (Seite 336) des gedruckten Buches, das $$\mathrm\TeX$$s Quellcode enthält [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373). Für viele Menschen (mich eingeschlossen) sind Knuths Erläuterungen gelegentlich eher knapp und prägnant und mitunter im Detail schwer nachzuvollziehen: illustrierte Beispiele sind immer sehr hilfreich.

### Ja, Tabellen sind komplex

In Abschnitt 768 (Seite 322) des Buches [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373), macht Knuth eine interessante Bemerkung:

> „Es ist irgendwie ein Wunder, wenn `\halign` und `\valign` funktionieren, denn sie schneiden quer durch so viele der Kontrollstrukturen von $$\mathrm\TeX$$“ angezeigt.

Darüber hinaus widmet Band IV der vierbändigen Buchreihe [$$\mathrm\TeX\text{ in Practice}$$](https://www.amazon.co.uk/Tex-Practice-Set-Stephan-Bechtolsheim/dp/038797296X/ref=sr_1_11?s=books\&ie=UTF8\&qid=1504256043\&sr=1-11\&keywords=TeX+in+Practice) nicht weniger als 180 Seiten (S. 199–379) dem Erstellen von Tabellen in $$\mathrm\TeX$$ über `\halign` und `\valign`.

Daher kann man mit Sicherheit feststellen, dass $$\mathrm\TeX$$ Tabellen tatsächlich „ziemlich knifflig“ sind.

### Spalten über mehrere Spalten erstrecken: \omit, \span und \multispan

Wie erwähnt, müssen wir, um $$\mathrm\TeX$$s Spaltenbreitenberechnungen zu untersuchen, „rohes“ $$\mathrm\TeX$$verwenden; das bedeutet eine Kombination aus primitiven Befehlen und einem $$\text{Plain }\mathrm\TeX$$ Makro namens `\multispan`. Obwohl wir diese Befehle nicht verwenden werden, um unsere Beispieltabellen direkt zu illustrieren (d. h. ohne alle $$\mathrm\TeX$$ Codezeilen vollständig zu erklären), lohnt es sich, eine kurze Notiz dazu aufzunehmen:

* `\halign`: Einer von zwei $$\mathrm\TeX$$ Primitiven (Befehlen) zum Erstellen von Tabellen. Der andere ist `\valign` , aber der wird nicht so häufig verwendet und in diesem Artikel nicht besprochen werden.
* `\omit`: Ein $$\mathrm\TeX$$ Primitiv (Befehl), das $$\mathrm\TeX$$ anweist, eine Präambelvorlage eines Tabelleneintrags zu ignorieren.
* `\span`: Ein $$\mathrm\TeX$$ Primitiv (Befehl), der verwendet wird, um zwei benachbarte Tabelleneinträge zu kombinieren.
* `\multispan{n}`: Ein einfaches $$\mathrm\TeX$$ Makro, um `n` Spalten zu überspannen.

Im Wesentlichen ignoriert das Überspannen von Spalten $$\mathrm\TeX$$ die entsprechende Anzahl von Tabellen-Präambelvorlagen und kombiniert die erforderliche Anzahl von Tabelleneinträgen zu einem einzigen Eintrag. `\multispan{n}` funktioniert, indem es sich in die Folge von `\omit` und `\span` Token, die benötigt werden, um `n` Spalten zu überspannen. Zum Beispiel, `\multispan{3}` expandiert zu `\omit\span\omit\span\omit`.

## Einführung unserer „Referenz“-Tabelle

Hier ist unsere Referenztabelle, gefolgt von einer kommentierten Version, die die bei ihrer Konstruktion verwendeten Elemente erläutert:

![{{{alt}}}](/files/8e0a5746f901464fc0f095ba138ef5d30fb0cc80)

Indem wir unsere Referenztabelle anpassen, werden wir beobachten, was mit der Tabellenbreite und der Breite einzelner Spalten geschieht, wenn wir Einträge hinzufügen, die sich über verschiedene Spalten erstrecken. Diese Referenztabelle wurde in rohem $$\mathrm\TeX$$ mit dem `\halign{...}` TeX-Primitiv zusammen mit einer Reihe benutzerdefinierter Makros erzeugt, die zum Setzen der Tabellen erforderlich sind – wir werden diese Makros nicht besprechen, da sie für das Verständnis der Beispiele und Erläuterungen nicht wesentlich sind.

Hier ist eine kommentierte Version unserer Referenztabelle, um ihre Merkmale zu erläutern:

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

Unsere erste Reihe von Beispieltabellen und die anfängliche Referenztabelle haben alle `\tabskip=0pt` gesetzt, sodass $$\mathrm\TeX$$ zwischen unseren Spalten keinen Platz hinzufügt: faktisch berühren sie sich alle. Der Grund dafür ist, die anfängliche Diskussion und die anschließenden Berechnungen zu vereinfachen – später im Artikel führen wir nicht null `\tabskip` Abstand wieder ein, um seine Wirkung auf die Berechnung der Breiten von über mehrere Spalten reichenden Spalten zu untersuchen.

Wie in den Anmerkungen erwähnt, haben wir am Anfang aller nicht über mehrere Spalten reichenden Tabelleneinträge (außer der ersten Zeile) etwas Leerraum (5 pt) hinzugefügt. Dieser Leerraum von 5 pt ist Teil der Gesamtbreite aller nicht über mehrere Spalten reichenden Einträge (außer der ersten Zeile) und wurde nur hinzugefügt, damit die Tabelle etwas weniger überladen aussieht.

### Eine kurze Notiz zu Tabellenbreiten

Die `\halign{...}` Befehl hat drei Formen:

* `\halign{...}`: setzt die Tabelle auf genau die Breite, $$\mathrm\TeX$$ die berechnet, basierend auf der Größe der Einträge (und `\tabskip` Abstand);
* `\halign to *width* {...}`: weist $$\mathrm\TeX$$ an, die Tabelle auf eine angegebene `*Breite*`;
* `\halign spread *amount*{...}`: passt die berechnete Breite um `*amount*`.

Wenn $$\mathrm\TeX$$ setzt eine Tabelle unter Verwendung von `\halign{...}` es muss die gesamte Tabelle in den Speicher einlesen, um die verschiedenen Berechnungen durchzuführen, die zum Setzen erforderlich sind. Folglich kann man, sofern die Breite nicht mit `\halign to *width* {...}` angegeben haben, die Endbreite erst kennen, wenn $$\mathrm\TeX$$ die Verarbeitung (das Setzen) abgeschlossen hat. Eine Möglichkeit, die Breite einer von `\halign{...}` erzeugten Tabelle zu ermitteln, besteht darin, die Tabelle zunächst in eine `\vbox{...}` (z. B., `\setbox0=\vbox{\halign{...}}`) zu setzen und dann zum Beispiel `\the\wd0` zu verwenden, um die Breite zu erhalten.

### Kein automatischer Zeilenumbruch in Tabelleneinträgen

Es ist wichtig zu beachten, dass wenn $$\mathrm\TeX$$ eine mit `\halign{...}` erzeugte Tabelle setzt, wird jeder Text innerhalb von Tabelleneinträgen nicht automatisch umbrochen: Tabelleneinträge werden in *eingeschränktem Horizontalmodus*gesetzt – genau wie ein `\hbox`. Um Zeilenumbrüche zu ermöglichen, muss der Text eines Tabelleneintrags in eine `\vbox{...}` eingeschlossen werden, zusammen mit der Verwendung eines geeigneten Wertes für `\hsize` innerhalb dieser `\vbox{...}`. Beachten Sie jedoch, dass Text innerhalb eines `\noalign{...}` Befehls (ein $$\mathrm\TeX$$ Primitiv), der in einem `\halign{...}` unterliegt $$\mathrm\TeX$$s Zeilenumbrüchen. Tatsächlich, und wie der Name schon sagt, `\noalign{...}` ermöglicht $$\mathrm\TeX$$ , aus dem `\halign{...}` zu „entkommen“ und Material zwischen den Zeilen der Tabelle einzufügen – typischerweise, um horizontale Linien zwischen Tabellenzeilen zu erzeugen.

### Nicht erlaubt: \halign{...} innerhalb von \hbox{...}

Sie können *direktes* ein `\halign{...}` innerhalb einer `\hbox{...}`setzen. Der Versuch, `\hbox{\halign{...}}` zu verwenden, erzeugt eine ziemlich verwirrende Fehlermeldung:

```latex
! Missing } inserted.
<eingefügter Text>
                }
<wird erneut gelesen>
                   \halign
l.1 \hbox{\halign
```

#### Eine Erklärung dieses Fehlers

Aufgrund der umschließenden `\hbox{...}` $$\mathrm\TeX$$ befindet sich *eingeschränktem Horizontalmodus*im `\halign{...}` ; dann erkennt es *Vertikalmodus* Befehl. Wenn Sie zum Beispiel `\halign{...}` in einem Absatz verwenden, $$\mathrm\TeX$$ beendet den Absatz, verarbeitet den `\halign{...}` und fährt dann mit dem Rest des Absatzes fort.

Wenn es innerhalb einer `\hbox{...}`, die `\halign{...}` veranlasst $$\mathrm\TeX$$ es, zu versuchen, durch Erzwingen des Abschlusses der aktuellen Gruppe in den Vertikalmodus zurückzukehren: $$\mathrm\TeX$$ meldet ein „`! Missing }`“ und gibt einen Fehler aus, weil es denkt, Sie hätten bei der Verwendung von Gruppierungen einen Fehler gemacht. Obwohl eine rechte geschweifte Klammer (`}`) möglicherweise nicht in Ihrem $$\mathrm\TeX$$ Code fehlt, ist die Fehlermeldung ein Symptom dafür, dass `\hbox{...}` sich „in den Weg stellt“ und $$\mathrm\TeX$$ sein „bestes Vermuten“ des geeigneten Vorgehens zur Lösung des Problems vornimmt.

## Beispiele für Tabellen mit über mehrere Spalten reichenden Einträgen

Die folgende Folge von Tabellenabbildungen bietet eine Reihe von Beispielen, um die Wirkung von über mehrere Spalten reichenden Tabelleneinträgen zu demonstrieren: Sie zeigt, dass längere Tabelleneinträge unerwartete Auswirkungen auf die Breite bestimmter Spalten – und folglich auf die Breite der Tabelle selbst – haben können. Die Frage, die wir beantworten werden, ist: Was macht $$\mathrm\TeX$$ wenn ein bestimmter Tabelleneintrag sich über eine Reihe von Spalten erstreckt, aber „zu breit zum Einpassen“ ist? Wie oben erwähnt, $$\mathrm\TeX$$ wendet tatsächlich einen bestimmten Algorithmus auf dieses Problem der Berechnung von Spaltenbreiten an: Die folgenden Beispiele sollen dabei helfen, ein „Gefühl“ für die Funktionsweise dieses Algorithmus zu entwickeln.

### Beispieltabelle 1

In diesem Beispiel verwenden wir `\multispan{2}` um die Spalten 1 und 2 mit einem Eintrag zu überspannen, dessen Text lautet **Eine Tabellenüberschrift**:

![{{{alt}}}](/files/7e47b4da0bf749035105139b2f4c054364dba418)

#### Beobachtungen

* Die Breite dieser Tabelle ist dieselbe wie die der [Referenztabelle](#reference-table): $$327.71722\text{pt}$$.
* Die Breite des Eintrags, der die Spalten 1 und 2 überspannt, ist $$81.04953\text{pt}$$ was kleiner ist als die Gesamtbreite der Einträge in den Spalten, die er überspannt: $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$

## Beispieltabelle 2

Wie in [Beispieltabelle 1](#example-table-1), verwendet auch dieses Beispiel `\multispan{2}` um die Spalten 1 und 2 zu überspannen, aber hier verwenden wir einen längeren Eintrag, dessen Text lautet **Eine etwas längere Tabellenüberschrift**.

![{{{alt}}}](/files/90ebbe8c9a6b95bccb4f0fc871317ee7efa87d38)

#### Beobachtungen

Wenn Sie dieses Beispiel mit unserer [Referenztabelle](#reference-table) vergleichen, können wir Folgendes sehen:

* Die Breite dieser Tabelle ist von $$327.71722\text{pt}$$ zu $$374.37032\text{pt}$$: insgesamt um $$46.6531\text{pt}$$.
* Die Breite des Eintrags, der die Spalten 1 und 2 überspannt ($$156.28664\text{pt}$$) ist größer als die Gesamtbreite der Einträge in den Spalten, die er überspannt: $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$. Dieser Unterschied beträgt $$156.28664\text{pt}-109.63355\text{pt} = 46.6531\text{pt}$$ , was genau dem Betrag entspricht, um den sich die Tabellenbreite erhöht hat.
* $$\mathrm\TeX$$ hat die Breite von Spalte 2 angepasst, um den zusätzlich erforderlichen Platz bereitzustellen. Später werden wir sehen, wie $$\mathrm\TeX$$ den Betrag berechnet, um den Spalte 2 vergrößert werden muss.
* Spalte 1 bleibt unbeeinflusst: Ihre Breite wurde durch den Eintrag, der die Spalten 1 und 2 überspannt, nicht verändert.

### Beispieltabelle 3

In diesem Beispiel verwenden wir `\multispan{3}` um die Spalten 1 bis 3 mit einem Eintrag zu überspannen, dessen Text derselbe ist wie [Beispieltabelle 2](#example-table-2): **Eine etwas längere Tabellenüberschrift**.

![{{{alt}}}](/files/695c325e3eff0579916012f9c6f9d84956607ac1)

#### Beobachtungen

* Die Breite dieser Tabelle ist dieselbe wie die der [Referenztabelle](#reference-table): $$327.71722\text{pt}$$.
* Die Breite des Eintrags, der die Spalten 1 bis 3 überspannt ($$156.28664\text{pt}$$) ist kleiner als die Gesamtbreite der Einträge in den drei Spalten, die er überspannt: $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} = 168.67254\text{pt}$$.
* Keine der Spaltenbreiten wurde durch den Eintrag beeinflusst, der die Spalten 1 bis 3 überspannt.

Beginnen Sie ein Muster zu erkennen?

### Beispieltabelle 4

Wie bei [Beispieltabelle 3](#example-table-3), verwenden wir hier `\multispan{3}` um die Spalten 1 bis 3 zu überspannen, aber diesmal mit einem deutlich längeren Eintrag, dessen Text lautet: **Eine erheblich längere Tabellenüberschrift, die sich weit erstreckt**.

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

#### Beobachtungen

* Im Vergleich zu der [Referenztabelle](#reference-table)ist die Breite dieser Tabelle von $$327.71722\text{pt}$$ zu $$465.95685\text{pt}$$: eine Zunahme um $$138.23963\text{pt}$$.
* Die Breite des Eintrags, der die Spalten 1 bis 3 überspannt, ist $$306.91216\text{pt}$$.
* Die Gesamtbreite der Einträge in den drei überspannten Spalten ist $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} = 168.67254\text{pt}$$.
* Der Breitenunterschied zwischen dem langen überspannenden Eintrag und den Einträgen in den Spalten 1 bis 3 beträgt $$306.91216\text{pt}-168.67254\text{pt}=138.23962\text{pt}$$. Derselbe Betrag (auf 4 Dezimalstellen genau!), um den sich die Tabellenbreite erhöht hat.
* Nur die Breite von Spalte 3 wurde erhöht: weder Spalte 1 noch Spalte 2 sind betroffen.

#### Ein Muster zeichnet sich ab

Wenn wir uns [Beispieltabelle 2](#example-table-2) und [Beispieltabelle 4](#example-table-4) ansehen, können wir erkennen, dass es in beiden Fällen die **letzte Spalte des Überspannungsbereichs** ist, deren Breite erhöht wurde, um Platz für den langen Eintrag zu schaffen, der sich über die Spalten erstreckte:

* In [Beispieltabelle 2](#example-table-2): Der lange Eintrag überspannte die Spalten 1 und 2. Spalte 2 wurde „gedehnt“.
* In [Beispieltabelle 4](#example-table-4): Der lange Eintrag überspannte die Spalten 1 bis 3. Spalte 3 wurde „gedehnt“.

#### Die Breite von Spalte 3: Zeichnet sich ein Algorithmus ab?

Die folgenden Berechnungen geben einen klareren Hinweis darauf, was $$\mathrm\TeX$$ tut. Hier ist, was wir wissen:

* Die Breite des langen Eintrags, der die Spalten 1 bis 3 überspannt, ist $$306.91216\text{pt}$$.
* Die Gesamtbreite der Einträge in den Spalten 1 und 2 ist $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$.

Was ist der Unterschied zwischen diesen Werten? Er beträgt $$306.91216\text{pt}-109.63355\text{pt} = 197.2786\text{pt}$$ und dies ist die für Spalte 3 verwendete Breite: Sie ergibt sich direkt aus dem von $$\mathrm\TeX$$.

### Beispieltabelle 5

Bevor wir zu einem komplizierteren Beispiel kommen, hier noch ein weiteres „einfaches“ Beispiel. Diese Tabelle enthält denselben langen Eintrag wie [Beispieltabelle 4](#example-table-4): **Eine erheblich längere Tabellenüberschrift, die sich weit erstreckt**; jedoch verwenden wir diesmal `\multispan{6}` , wodurch dieser Eintrag die gesamte Tabelle überspannen kann. Wie Sie sehen, hat die resultierende Tabelle immer noch dieselbe Breite wie unsere [Referenztabelle](#reference-table) ($$327.71722\text{pt}$$) was bedeutet, dass keine Spalten durch diesen sehr langen Eintrag beeinflusst wurden. Offensichtlich liegt das daran, dass die Breite des Eintrags ($$306.91216\text{pt}$$) kleiner ist als die Gesamtbreite aller Einträge, die er überspannt: $$327.71722\text{pt}$$; also die Breite der Tabelle.

![{{{alt}}}](/files/720283f499fc1e2401a208d1bc58c53b774ada49)

### Beispieltabelle 6: Etwas komplizierter

Hier betrachten wir eine Reihe von drei Beispieltabellen (6(a)–6(c)), um die Wirkung zweier unterschiedlicher Einträge zu zeigen, die beide bis in Spalte 5 reichen. [Beispieltabelle 6(a)](#example-table-6a) und [Beispieltabelle 6(b)](#example-table-6b) zeigen jeweils eine Tabelle mit einem einzigen Eintrag, der sich über mehrere Spalten bis einschließlich Spalte 5 erstreckt. [Beispieltabelle 6(c)](#example-table-6c) kombiniert beide über mehrere Spalten reichenden Einträge in einer einzigen Tabelle und stellt die Frage: Welcher Eintrag bestimmt tatsächlich die Breite von Spalte 5, und warum? Die Antwort führt uns zum Wesenskern des von $$\mathrm\TeX$$.

#### Beispieltabelle 6(a)

![{{{alt}}}](/files/7d7efd90d8ed20d33811e66805e23039df641ecc)

**Beobachtungen**

* Im Vergleich zu der [Referenztabelle](#reference-table)ist die Breite dieser Tabelle von $$327.71722\text{pt}$$ zu $$371.11153\text{pt}$$: eine Zunahme um $$43.39431\text{pt}$$.
* Die Breite des Eintrags, der die Spalten 3 bis 5 überspannt, ist $$215.06683\text{pt}$$.
* Die Gesamtbreite der Einträge in den Spalten 3 bis 5 ist $$59.03899\text{pt} + 52.98344\text{pt} + 59.6501\text{pt} = 171.67253\text{pt}$$.
* Der Breitenunterschied zwischen den in den Spalten 3 bis 5 überspannten Einträgen und der Breite des überspannenden Eintrags beträgt $$215.06683\text{pt}-171.67253\text{pt}=43.3943\text{pt}$$: der exakte Betrag (auf 4 Dezimalstellen genau!), um den sich die Breite der Tabelle erhöht hat.

#### Beispieltabelle 6(b)

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

**Beobachtungen**

* Im Vergleich zu der [Referenztabelle](#reference-table)ist die Breite dieser Tabelle von $$327.71722\text{pt}$$ zu $$353.3233\text{pt}$$: eine Zunahme um $$25.60608\text{pt}$$.
* Die Breite des Eintrags, der die Spalten 1 bis 5 überspannt, ist $$306.91216\text{pt}$$.
* Die Gesamtbreite der Einträge in den Spalten 1 bis 5 ist $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} + 52.98344\text{pt} + 59.6501\text{pt} = 281.30608\text{pt}$$.
* Der Breitenunterschied zwischen den in den Spalten 1 bis 5 überspannten Einträgen und der Breite des überspannenden Eintrags beträgt $$306.91216\text{pt}-281.30608\text{pt}=25.60608\text{pt}$$: **note** dies ist *weniger* als der für [Beispiel 6(a)](#example-table-6a) berechnete Wert, der $$43.3943\text{pt}$$.

#### Beispieltabelle 6(c)

Hier kombinieren wir die Einträge in den Beispieltabellen [6(a)](#example-table-6a) und [6(b)](#example-table-6b) zu einer einzigen Tabelle: Was passiert?

![{{{alt}}}](/files/71042b4c4996a6d47ca0e01c071091e5f63285ab)

**Beobachtung**

* Im Vergleich zu der [Referenztabelle](#reference-table)ist die Breite dieser Tabelle von $$327.71722\text{pt}$$ zu $$371.11153\text{pt}$$: eine Zunahme um $$43.39431\text{pt}$$. Wir stellen fest, dass dies genau dasselbe ist wie [Beispieltabelle 6(a)](#example-table-6a).

#### Was macht $$\mathrm\TeX$$ ?

Um die Ergebnisse von $$\mathrm\TeX$$s Algorithmus und Entscheidungsprozessen zu verstehen, stellen wir fest, dass dieser Eintrag

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

über die von $$25.60608\text{pt}$$überspannten Einträge hinausreicht; allerdings reicht dieser Eintrag

![{{{alt}}}](/files/603ffde31aa4843be556089e97f720250726c675)

noch weiter über die überspannten Einträge hinaus: um $$43.3943\text{pt}$$. Daher „gewinnt“ dieser Eintrag das Rennen, und Spalte 5 wird um den **maximalen** dieser beiden Werte ($$43.3943\text{pt}$$) vergrößert. Die Breite von Spalte 5 wird nun $$59.6501\text{pt} + 43.3943\text{pt} = 103.0444\text{pt}$$ angepasst, um den Eintrag aufzunehmen, der die Spalten 3 bis 5 überspannt. Unsere Beschreibung der genauen „Abfolge der Ereignisse“ ist leicht vereinfacht, aber das Ergebnis ist wie beschrieben.

## Etwas Komplexität zurückbringen

Um die Komplexität unserer bisherigen Diskussionen zu minimieren, haben wir relativ einfache Beispiele verwendet, um die Grundsätze von $$\mathrm\TeX$$s Algorithmus zu demonstrieren; insbesondere haben wir `\tabskip=0pt`. In der Praxis werden Tabellen in der „realen Welt“ wahrscheinlich viele Einträge enthalten, die sich über eine Reihe von Spalten erstrecken, und natürlich werden sie nicht-null Werte für den `\tabskip` Abstand haben – ein Thema, auf das wir nun zurückkommen.

### \tabskip-Abstand und Breiten über mehrere Spalten reichender Spalten

Das Design von Tabellen erfordert oft das Hinzufügen von Leerraum zwischen Spalten, und natürlich hat $$\mathrm\TeX$$ diese Möglichkeit durch einen primitiven Befehl namens `\tabskip`. Dieser Befehl kann verwendet werden, um festen oder flexiblen Abstand einzufügen:

* vor einer Tabelle (d. h. links von Spalte 1);
* zwischen einer oder mehreren Spalten;
* nach der Tabelle (d. h. rechts von der letzten Spalte).

Hier ein Beispiel zur Erinnerung:

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

### Wie beeinflusst \tabskip-Abstand die Breiten über mehrere Spalten reichender Spalten?

Das Vorhandensein von nicht-null `\tabskip` Abstand zwischen Spalten bietet zusätzlichen Raum, den über mehrere Spalten reichende Einträge „aufsaugen“ können, bevor $$\mathrm\TeX$$ daran denken muss, die Breite der letzten Spalte in einem Überspannungsbereich zu erhöhen.

In unserem nächsten Beispiel verwenden wir zwei Tabellen, um die Ergebnisse des Überspannens von zwei Spalten zu vergleichen. Der einzige Unterschied zwischen den Tabellen ist die Verwendung von `\tabskip` Abstand.

* Das erste Beispiel verwendet unsere ursprüngliche „Referenz“-Tabelle, die, wenn Sie sich erinnern, auf `\tabskip=0pt`.
* Das zweite Beispiel verwendet eine modifizierte Version unserer [Referenztabelle](#reference-table) (oben kommentiert), die `\tabskip=10pt` vor und nach der Tabelle gesetzt hat, aber noch wichtiger: sie hat `\tabskip=20pt` zwischen den Spalten gesetzt.

Innerhalb der *modifizierten* Referenztabelle haben die beiden überspannten Spalten keinen Einfluss auf die Spaltenbreiten (und die Tabellenbreite), aber sie beeinflussen die Breite von Spalte 2 (und die Tabellenbreite) in der *ursprünglichen* [Referenztabelle](#reference-table).

### Ursprüngliche Referenztabelle: \tabskip=0pt

Hier zeigen wir unsere ursprüngliche [Referenztabelle](#reference-table) zusammen mit einer zweiten Tabelle (abgeleitet von unserer ursprünglichen [Referenztabelle](#reference-table)), die einen Eintrag „**Lange Tabellenüberschrift testen**“ enthält, der die Spalten 1 und 2 überspannt. Ganz klar werden Spalte 2 (der zweiten Tabelle in der Abbildung) und damit die gesamte Tabelle durch die überspannten Spalten beeinflusst.

![{{{alt}}}](/files/91808bc05933d51f6d8b32540c13476ebdddd016)

### Modifizierte Referenztabelle: \tabskip=20pt

Hier zeigen wir unsere modifizierte Referenztabelle zusammen mit einer zweiten Tabelle (abgeleitet von unserer modifizierten Referenztabelle), die ebenfalls einen Eintrag „**Lange Tabellenüberschrift testen**“ enthält, der die Spalten 1 und 2 überspannt. Ganz klar werden innerhalb der zweiten Tabelle in der Abbildung weder die Breite von Spalte 2 noch die der Tabelle durch die überspannten Spalten beeinflusst. In diesem Fall hat das Vorhandensein von `\tabskip` Abstand (`20 pt`) zwischen den Spalten dabei geholfen, den vom Text im Eintrag, der die Spalten 1 und 2 überspannt, benötigten Platz „aufzusaugen“:

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

## Das Wesentliche von $$\mathrm\TeX$$s Algorithmus

Hoffentlich hat die obige Reihe von Beispielen dabei geholfen, ein „Gefühl“ dafür zu entwickeln, was $$\mathrm\TeX$$ tut, um überspannte Einträge unterzubringen, und wie $$\mathrm\TeX$$ gegebenenfalls die Breite der **letzten** Spalte innerhalb jedes Bereichs überspannter Spalten anpasst. Zusätzlich zur Breite der Einträge innerhalb einzelner überspannter Spalten ist das Vorhandensein von nicht-null `\tabskip` Abstand ein wichtiger Faktor, den $$\mathrm\TeX$$ bei der Entscheidung berücksichtigt, ob Spaltenbreiten angepasst werden müssen. Der wichtigste Punkt, an den man sich erinnern sollte, ist, dass $$\mathrm\TeX$$s Ziel darin besteht, eine geeignete Breite für die **letzte Spalte** innerhalb jedes Bereichs überspannter Spalten zu berechnen.

### Abschließendes Tabellenbeispiel: letzte Spalten in einem überspannten Bereich

In diesem letzten Beispiel verwenden wir erneut unsere modifizierte Referenztabelle (mit `\tabskip` oben besprochenen Glue-Werten), um eine weitere Tabelle abzuleiten, die verschiedene von Regeln überspannte Spalten enthält – wir haben Regeln verwendet, um die Spannweiten leichter sichtbar zu machen.

Die beiden Tabellen wurden sorgfältig ausgerichtet, um zu zeigen, dass in der oberen Tabelle keine Spalten vor Spalte 5 von den überspannten Spalten betroffen sind. Der dunkler grüne Bereich links im Diagramm zeigt, dass die Spalten 1 bis 4 beider Tabellen weiterhin perfekt ausgerichtet sind. Rechts befindet sich ein hellgrün schattierter Bereich, der zeigt, dass nur die Spalten 5 und 6 von den überspannten Einträgen betroffen sind.

In der oberen Tabelle lauten die Überspannungen wie folgt:

* Spalten 1 bis 5: überspannt von einer $$400\text{pt}$$ Regel;
* Spalten 3 bis 5: überspannt von einer $$200\text{pt}$$ Regel;
* Spalten 4 bis 6: überspannt von einer $$250\text{pt}$$ Regel.

![{{{alt}}}](/files/11aab84f3255f5f5210bc72fe30d254ebab0c9a5)

Auch hier lautet die Erklärung, dass innerhalb einer Folge überspannter Spalten nur die Breite der letzten Spalte angepasst wird (falls erforderlich): Dazwischenliegende Spalten bleiben unberührt, und hier bedeutet das die Spalten 1 bis 4 – obwohl natürlich die Breite der Spalten 1 bis 4 (und der dazwischenliegenden `\tabskip` Glue) bei der Berechnung der angepassten Breiten der Spalten 5 und 6 berücksichtigt wird.

### Ein Durchgang durch $$\mathrm\TeX$$s Algorithmus

Abschließen werden wir mit einem *vereinfachten* Durchgang durch „$$\mathrm\TeX$$’s Denkprozesse“, während es die Breiten der Spalten in überspannten Einträgen ermittelt. Das Beschreiben $$\mathrm\TeX$$’s Algorithmen ist nicht immer unkompliziert, daher werden wir uns einige „vereinfachende künstlerische Freiheiten“ erlauben, um einen Überblick darüber zu geben, was geschieht. Leser, die an allen unsauberen Details interessiert sind, werden auf Abschnitt 801 (Seite 336) des gedruckten Buchs verwiesen, das $$\mathrm\TeX$$s Quellcode enthält [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373).

Tabellen aus der Praxis werden oft mit vielen Verwendungen des `\span` Primitivs (z. B. innerhalb von $$\mathrm\LaTeX$$ Paketen), um mehrere Instanzen überspannter Spalten innerhalb der Tabelle zu erzeugen. Um dies zu verwalten, halten die Datenstrukturen (tief in $$\mathrm\TeX$$) Informationen (sogenannte *Span-Knoten*) vor, die $$\mathrm\TeX$$ über die Verbindungen (Spannen) zwischen Tabelleneinträgen/-spalten Auskunft geben. Offensichtlich $$\mathrm\TeX$$ muss seine Algorithmen systematisch anwenden und die gesamte Tabelle verarbeiten, um seine abschließenden Berechnungen durchzuführen – um alle Spaltenbreiten, die Gesamtbreite der Tabelle und, falls erforderlich, den Betrag zu bestimmen, um den sich die flexiblen Glues, die in der Tabelle verwendet werden, strecken oder schrumpfen müssen. Es ist eigentlich nicht überraschend, dass $$\mathrm\TeX$$ die endgültige Tabellenbreite erst mitteilen kann, wenn es das `\halign{...}` Kommando vollständig verarbeitet hat – es hat wirklich viel zu tun!

Der Ausgangspunkt für die Berechnung der Spaltenbreiten ist Spalte 1, denn natürlich kann nichts von links von (und *über/in*) Spalte 1 hinweg spannen. $$\mathrm\TeX$$ beginnt damit, die Breite von Spalte 1 zu bestimmen, indem ermittelt wird, welcher Eintrag die maximale *natürliche Breite*. Nennen wir diese maximale Breite $$w\_1$$und falls es Einträge gibt, die von Spalte 1 bis Spalte 2 spannen, nennen wir die Breite dieses Eintrags $$w\_{12}$$ (Breite von 1 bis 2). Außerdem bezeichnen wir den `\tabskip` Glue zwischen den Spalten 1 und 2 als $$t\_{1}$$—beachte, dass wir nur die *natürliche Breite* von diesem `\tabskip` Glue berücksichtigen und vorerst alle Streck- oder Schrumpfanteile ignorieren, die er besitzen könnte. Außerdem sei die maximale natürliche Breite aller nicht überspannenden Einträge in Spalte 2 $$w\_2$$.

Der entscheidende Punkt ist, dass $$\mathrm\TeX$$ versucht, die Breite von Spalte 2 zu berechnen, indem nur diejenigen Einträge berücksichtigt werden, bei denen die Spanne *beginnt* mit Spalte 1 *endet* an Spalte 2. Die entscheidende Überlegung für $$\mathrm\TeX$$ ist der Test $$\max(w\_{2}, w\_{12} - (w\_1+ t\_1))$$—es könnten mehrere Einträge existieren, die die Spalten 1 und 2 überspannen: einige mögen schmal sein (kleine $$w\_{12}$$), andere sehr breit (große $$w\_{12}$$) daher $$\mathrm\TeX$$ sucht nach demjenigen, der die größte Wirkung hat (daher die $$\max(\text{...})$$). Hier ist der Wert von $$w\_{12} -(w\_1+ t\_1)$$ der Betrag, um den ein die Spalten 1 und 2 überspannender Eintrag von Spalte 1 in Spalte 2 „überläuft“: beachte, dass $$\mathrm\TeX$$ unter Verwendung der Breite von Spalte 1 **und** Der Stil `\tabskip` Abstand ($$t\_{1}$$) zwischen den Spalten 1 und 2. Sobald $$\mathrm\TeX$$ festgestellt hat, ob sich irgendwelche Spannen von Spalte 1 bis 2 tatsächlich auf die Breite von Spalte 2 auswirken, setzt es die Breite von Spalte 2 auf den maximal ermittelten Wert (unter Verwendung des beschriebenen Tests). $$\mathrm\TeX$$ arbeitet sich durch alle anderen Spalten weiter hindurch und führt ähnliche Tests durch.

Und schließlich zitieren wir hier, nur der Vollständigkeit halber, das Wesentliche von $$\mathrm\TeX$$s Algorithmus zur Berechnung der Spaltenbreiten (entnommen aus Knuths Quellcodedokumentation von $$\mathrm\TeX$$):

Sei $$w\_{ij}$$ das Maximum der natürlichen Breiten aller Einträge, die die Spalten $$i$$ bis $$j$$, einschließlich, überspannen. Die endgültigen Spaltenbreiten sind durch die Formel definiert

$$\begin{equation\*} w\_j=\max\_{1\leq i\leq j}\biggl(w\_{ij}-\sum\_{i\leq k< j}(t\_k+w\_k)\biggr) \end{equation\*}$$

wobei $$t\_k$$ ist die natürliche Breite des tabskip-Glue zwischen den Spalten $$k$$ und $$k+1$$.

## Kolophon: Mit Overleaf Tabellen als SVG-Grafiken erstellen

Alle $$\mathrm\TeX$$ in diesem Artikel vorgestellten Tabellen sind Scalable Vector Graphics-(SVG)-Dateien, die auf der Overleaf-Plattform erzeugt wurden. Die Anmerkungen (Pfeile und grüne Kästen) wurden hinzugefügt, indem die SVG-Grafik in Inkscape geöffnet wurde – beachte jedoch, dass der Text der Anmerkungen in $$\mathrm\TeX$$ als zusätzlicher Text zur Tabelle gesetzt wurde: In Inkscape wurden nur die Pfeile und grünen Hintergründe hinzugefügt. Wenn du wissen möchtest, wie dies erreicht wurde, lies weiter.

Die Server von Overleaf verwenden die $$\mathrm\TeX \text{ Live}$$ Distribution, die zusätzlich zu $$\mathrm\TeX$$-basierten Satzsystemen eine Fülle sehr nützlicher $$\mathrm\TeX$$bezogener Software-Tools und Dienstprogramme bereitstellt. Darunter befindet sich eines namens [`dvisvgm`](https://dvisvgm.de) das, wie der Name schon sagt, die $$\mathrm\TeX$$traditionelle DVI (**D**e**V**ice **I**ndependent) Ausgabe-Dateiformat in SVG umwandelt. Unter seinen vielen [Kommandozeilenoptionen](https://dvisvgm.de/Manpage/) `dvisvgm` bietet es eine Option (`-n` oder `--no-fonts`) an, die es anweist, den gesamten Text in *Pfade* umzuwandeln, was bedeutet, dass der Text in SVG-Grafiken mit Linien und Kurven statt mit echten Schriftarten und Glyphen gezeichnet wird. Dies kann die Dateigröße der resultierenden SVG-Grafik erhöhen, stellt aber sicher, dass die SVG-Grafiken äußerst portabel sind und mit fast sicherer Wahrscheinlichkeit auf jedem Gerät gut funktionieren.

### Also... wie wurde das gemacht?

In einer [vorheriger Artikel](https://www.overleaf.com/blog/510-using-luatex-to-run-tools-and-utilities-installed-on-overleafs-servers) Ich habe erläutert, wie du $$\text{Lua}\mathrm\TeX$$ verwenden kannst, um die verschiedenen auf den Servern von Overleaf installierten Software-Tools und Dienstprogramme auszuführen – das ist eine äußerst einfache und bequeme Technik. Diese Technik wurde verwendet, um SVG-Grafiken gesetzter $$\mathrm\TeX$$ Tabellen zu erzeugen, und zwar wie folgt. Aus der Haupt- $$\mathrm\TeX$$ dokumentdatei wurde der Code zum Setzen jeder Tabelle (erstellt mit using `\halign`) in eine `.tex` Datei geschrieben. Dies wurde erreicht, indem der Tabellen-Code in ein Paar von Befehlen eingeschlossen wurde, die ich `\beginscoop` und `\endscoop`. Es gibt wahrscheinlich viele andere Möglichkeiten, das gewünschte Ergebnis zu erzielen, aber hier sind die Makrodefinitionen, die ich verwendet habe:

```latex
\def\cc{\catcode`\#=12\relax}
\long\def\scoop#1\endscoop{\global\fulltoks={#1}\egroup}
\def\beginscoop{\global\advance\numfigs by1\relax\bgroup\cc\scoop}
```

So verwendest du sie:

```latex
\beginscoop
\halign{...}
\endscoop
```

Beachten Sie, dass der `\endscoop` Das Token dient lediglich dazu, den Parameter von `\scoop` Makros ansehen: $$\mathrm\TeX$$ verwirft effektiv das `\endscoop` Token, sodass wir es tatsächlich nicht definieren müssen (z. B. durch `\def\endscoop{...}`).

Die $$\mathrm\TeX$$ im `\halign{...}` enthaltene Code wird in ein `toks` Register namens `\fulltoks`. Ein kniffliger Punkt, auf den ich gestoßen bin (bei $$\text{Lua}\mathrm\TeX$$), war die Notwendigkeit zu verhindern, dass `#` Zeichen innerhalb der `\halign{...}` Präambel zu „verdoppeln“ in `##` beim Ausgeben in eine `.tex` Datei. Um dies zu vermeiden, musste ich die `\catcode`von `#` Zeichen vor dem Speichern des $$\mathrm\TeX$$ Codes (Token) im `\fulltoks` Token-Register vorübergehend auf 12 setzen.

Der nächste Schritt besteht darin, die in `\fulltoks` enthaltenen Token als eine $$\mathrm\TeX$$ Datei zu schreiben – da ich $$\text{Lua}\mathrm\TeX$$ verwendete, erwies sich das als *extrem* einfach dank $$\text{Lua}\mathrm\TeX$$s wunderbarer Lua-API. Kurz gesagt, ich schrieb ein Makro namens `\writefile{...}` das als Parameter den Namen eines Token-Registers annimmt, dessen Token du in eine Datei schreiben willst (z. B. `\writefile{fulltoks}`). Innerhalb des `\writefile{...}` Makros verwendete ich die Lua-API, um eine textuelle Darstellung des `\fulltoks` Token-Registers zu erhalten:

```latex
\def\writefile#1{%
\directlua{
...
...
 local p=tex.toks["#1"]
...
...
}}
```

Hier ist ein Screenshot, der noch etwas mehr von der `\writefile{...}` Befehl:

[![{{{alt}}}](/files/66c2b14deb11bdb5cd6c06e778b7d1a4ce6ff53c)](https://www.filepicker.io/api/file/ngeDmgRStGWvG044RE1A)

Die Lua-Sprache und die von $$\text{Lua}\mathrm\TeX$$ bereitgestellte Lua-API können oft $$\mathrm\TeX$$ Programmieraufgaben vereinfachen, und gerade wegen dieser nützlichen und leistungsstarken Funktionen verwende ich $$\text{Lua}\mathrm\TeX$$ seit \~2009 – und bin weiterhin ein großer Fan dieses wirklich großartigen $$\mathrm\TeX$$ Engines. OK, die $$\text{Lua}\mathrm\TeX$$ Werbung endet jetzt.

Nachdem ich den $$\mathrm\TeX$$ gespeicherten Code so einfach erhalten hatte, `\fulltoks` wird er zusammen mit etwas zusätzlichem Code in eine Datei geschrieben, um daraus eine korrekt formatierte $$\mathrm\LaTeX$$ Datei zu machen. Die nächsten Schritte sind:

1. Verarbeite die `.tex` Datei, die unsere Tabelle enthält, mit $$\text{pdf}\mathrm\LaTeX$$ (im DVI-Modus), sodass es die Tabelle setzt und eine `.dvi` Datei für `dvisvgm` zum Verarbeiten erzeugt. Ja, du kannst $$\text{Lua}\mathrm\TeX$$ verwenden, um $$\text{pdf}\mathrm\LaTeX$$– wiederum verwendete ich die in einem [vorheriger Artikel](/latex/de/ausfuhrliche-artikel/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md).
2. Und schließlich führe `dvisvgm` aus, um die `.dvi` Datei zu verarbeiten und eine SVG-Grafik der gesetzten $$\mathrm\TeX$$ Tabelle zu erzeugen.
3. Um die eigentlichen SVG-Grafiken zu erhalten, kannst du von Overleaf eine ZIP-Datei herunterladen – achte dabei darauf, die **Eingabe- und Ausgabedateien** Option.


---

# 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/47-tex-tables-how-tex-calculates-spanned-column-widths.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.
