+ All Categories
Home > Documents > TEX Praxis || Tabellen

TEX Praxis || Tabellen

Date post: 10-Dec-2016
Category:
Upload: silvio
View: 223 times
Download: 2 times
Share this document with a friend
23
9 Tabellen Tabellen oder Auflistungen sind eine der faszinierendsten, aber auch eine der gewoh- nungsbedtirftigsten Seiten von TEX. Dies kommt daher, daB es eine riesige Anzahl von Variationsmoglichkeiten bei Tabellen gibt, und TEX f1exibel genug sein muB, urn mit der ganzen Bandbreite umgehen zu konnen. Diese Flexibilitat hat ihren Preis: Sie mtis- sen TEX ziemlich genau sagen, wie Ihre Tabelle aussehen solI. (Dies beschreibt die Si- tuation in Plain- TEX. oder irgend eines der existierenden Tabellenformatierungs- Makropakete wird dem Anwender Befehle "auf hoherer Ebene" zur Verftigung stelIen, die fUr die meisten Zwecke angemessen sind. Vergleichen Sie auch die in Kapitel 10 be- schriebenen Tabulierfahigkeiten von Plain-TEX.) Oben Gesagtes bedeutet aber nicht, daB es sehr schwierig ist, mit TEX Tabellen zu erzeugen, sondem nur, daB es viele Kleinigkeiten gibt, auf die man achten sollte. So kann es passieren, daB Sie mehrere Versuche benotigen, bevor Ihre Tabelle so aussieht, wie Sie sie sich vorgestellt haben. Lassen Sie sich also nicht entmutigen - wenn Sie mit den grundlegenden Konzepten, die wir bisher besprochen haben, vertraut sind, kann dieses Kapitel Sie sogar in den Rang eines TEX-Meisters befOrdem. Und schlieBlich werden Sie mit Tabellen belohnt, die ihres Gleichen suchen. Der erste Schritt beim Setzen einer Tabelle besteht darin, sie in Gedanken in ihre Ein- zelteile zu zerlegen, also ihre innere Struktur aufzusptiren. Meistens besteht die Tabelle aus Zeilen (Reihen), jede mit einer bestimmten Anzahl von Eintdigen: Einander entspre- chende Eintrage der Zeilen bilden vertikal eine Spalte und sind eng verwandt, sowohl vom Inhalt wie auch typographisch (d. h. die Eintrage werden in der Regel identisch formatiert, eine Eigenschaft, der TEX Rechnung tragt). Hier ist eine alltagliche Tabelle, zusammen mit der in Einzelteile aufgelOsten Darstellung: R. Séroul et al., TEX Praxis © Birkhäuser Verlag 1998
Transcript
Page 1: TEX Praxis || Tabellen

9 Tabellen

Tabellen oder Auflistungen sind eine der faszinierendsten, aber auch eine der gewoh­nungsbedtirftigsten Seiten von TEX. Dies kommt daher, daB es eine riesige Anzahl von Variationsmoglichkeiten bei Tabellen gibt, und TEX f1exibel genug sein muB, urn mit der ganzen Bandbreite umgehen zu konnen. Diese Flexibilitat hat ihren Preis: Sie mtis­sen TEX ziemlich genau sagen, wie Ihre Tabelle aussehen solI. (Dies beschreibt die Si­tuation in Plain-TEX. L:\T~ oder irgend eines der existierenden Tabellenformatierungs­Makropakete wird dem Anwender Befehle "auf hoherer Ebene" zur Verftigung stelIen, die fUr die meisten Zwecke angemessen sind. Vergleichen Sie auch die in Kapitel 10 be­schriebenen Tabulierfahigkeiten von Plain-TEX.)

Oben Gesagtes bedeutet aber nicht, daB es sehr schwierig ist, mit TEX Tabellen zu erzeugen, sondem nur, daB es viele Kleinigkeiten gibt, auf die man achten sollte. So kann es passieren, daB Sie mehrere Versuche benotigen, bevor Ihre Tabelle so aussieht, wie Sie sie sich vorgestellt haben. Lassen Sie sich also nicht entmutigen - wenn Sie mit den grundlegenden Konzepten, die wir bisher besprochen haben, vertraut sind, kann dieses Kapitel Sie sogar in den Rang eines TEX-Meisters befOrdem. Und schlieBlich werden Sie mit Tabellen belohnt, die ihres Gleichen suchen.

Der erste Schritt beim Setzen einer Tabelle besteht darin, sie in Gedanken in ihre Ein­zelteile zu zerlegen, also ihre innere Struktur aufzusptiren. Meistens besteht die Tabelle aus Zeilen (Reihen), jede mit einer bestimmten Anzahl von Eintdigen: Einander entspre­chende Eintrage der Zeilen bilden vertikal eine Spalte und sind eng verwandt, sowohl vom Inhalt wie auch typographisch (d. h. die Eintrage werden in der Regel identisch formatiert, eine Eigenschaft, der TEX Rechnung tragt). Hier ist eine alltagliche Tabelle, zusammen mit der in Einzelteile aufgelOsten Darstellung:

R. Séroul et al., TEX Praxis© Birkhäuser Verlag 1998

Page 2: TEX Praxis || Tabellen

142 Kapitel 9. Tabel/en

Name Typ

x ganze Zahl y reell z Boolesch

9.1 Die Tabellenpraambel

Name Wert

1987 x 3.14159

falsch y

z

Typ

ganze Zahl

reell

Boolesch

Wert

1987

3.14159

falsch

Nachdem Sie die Tabelle in Gedanken zerlegt haben, konnen Sie TEX die Informatio­nen, die es benotigt, geben: Wie sollen die Zeilen gesetzt und womit gefUllt werden? Das machen Sie mit dem \halign-Befehl und diesem Tabellengrundgeriist:

\halign{ · .# .. & .• # .. & .. # .. & •. # .. & .. # .. \cr · . . .• & ..... & ..•.. & ..•.. & ..••. \cr

· . . .. & ..... & ..... & ..•.. & ..•.. \cr }

Das Material in den geschweiften Klammem nach dem \halign-Befehl ist in Zeilen unterteilt, jede Zeile wird durch ein \cr abgeschlossen. Spalteneintrage innerhalb einer Zeile werden durch ein Et-Zeichen, &, getrennt. GroBtenteils entsprechen die Zeilen im Quelltext den Zeilen der Tabelle, aber die erste "Zeile" hat eine besondere Aufgabe: Sie wird als Praambel (oder Schablone) bezeichnet, und gibt die Antwort auf die obige Frage: Wie solljede Zeile gesetzt werden?

Beachten Sie, daB die Prliambel das #-Zeichen enthalt - abwechselnd mit den Et­Zeichen. Alles Material urn das # und zwischen den flankierenden & betrifft die gesamte entsprechende Spalte. Das # selbst ist ein Platzhalter fUr das Material, das in den anderen Zeilen steht.

Der Rest von \halign beantwortet die zweite Frage: Womit sollen die Zeilen gefUllt werden? Wahrend TEX jede Zeile liest, trennt es diese an den Et-Zeichen in einzelne Eintrage auf. Diese Eintrage fUgt TEX dann in der Praambel anstelle des entsprechenden # ein. Letztlich setzt TEX dann eben die Verbindung des Materials aus der Praambel mit dem an stelle der Platzhalter gesetzten Material als den entsprechenden Tabelleneintrag.

Page 3: TEX Praxis || Tabellen

9.2 Einfache Auf listungen 143

9.2 Einfache Auflistungen Unter einer einfachen Auflistung verstehen wir, daB weder Spezialfalle noch Linien,

die Spalten und Zeilen trennen, vorkommen soIlen. Unsere erste Auflistung besitzt die einfachste aIler moglichen Praambeln:

\halign{ # & # & # \cr Name&Typ & Wert \cr

Name Typ Wert

$x$ &ganze Zahl& 1987 \cr x ganze Zahl 1987

$y$ &reell & 3.14159 \cr y reell 3.14159

$z$ &Boolesch & falsch \cr z Boolesch falsch

}

Die drei Schablonen bestehen aus nichts als einem #. Urn die erste Zeile der Tabelle aufzubauen, ersetzte TEX das erste # in der Praambel durch Name, das zweite durch Typ und das dritte durch Wert. Analog geht es bei den folgenden Zeilen vor.

Das ist eine TabeIle, aber sie ist noch nicht sehr schon! Es ist nicht genug Platz zwi­schen den Spalten. TEX formatiert eine Spalte immer genau so breit wie den breitesten Eintrag in dieser Spalte und setzt Spalte neben Spalte - ohne Zwischenraum. Es gabe uberhaupt keinen Leerraum zwischen N arne und Typ, wenn nicht schon in der Scha­blone welcher ware. Es zeigt sich aber, daB TEX Leerzeichen am Anfang einer Schablone ignoriert, was also TEX wirklich setzt, ist Namesp, TypSP, usw. (Denken Sie daran, daB mehrere aufeinanderfolgende Leerzeichen als ein einziges interpretiert werden.)

Urn die Situation zu verbessem, ftigen wir einige \quad's in der Praambel ein und schreiben die zweite Spalte kursiv. Weiter werden wir von nun an die Et-Zeichen direkt hinter dem vorhergehenden Eintrag schreiben, so daB sich kein ungewoIlter Leerraum einschleichen kann. (Natiirlich mussen wir im Quelltext die Spalten nicht ausrichten, es dennoch zu tun, erhoht aber die Lesbarkeit des Quelltextes, da dann die Struktur der Ta­belle deutlicher zu Tage tritt.)

\halign{ #& \quad\it#& \quad #\cr

Name Typ Wert Name& Typ& Wert\cr $x$& ganze Zahl& 1987\cr x ganze Zahl 1987

$y$& reell& 3. 14159\cr y reell 3.14159

$z$& Boolesch& falsch\cr z Boolesch falsch

}

Jedem Eintrag der zweiten Spalte geht nun effektiv ein \quad\i t voraus und jedem Eintrag in der dritten Spalte ein \quad. Deshalb sind Schablonen so nutzlich. Sie erlauben Ihnen, die Gemeinsamkeiten der Eintrage einer Spalte "auszuklammem", so daB Sie das Erscheinungsbild einer ganzen Tabelle andern konnen, ohne die einzelnen Eintrage zu verandern.

Beachten Sie, daB das der \i t-Befehl in der zweiten Schablone (\i t# ) nicht von geschweiften Klammem umgeben ist. Man benotigt sie nicht: Ein Tabelleneintrag bildet

Page 4: TEX Praxis || Tabellen

144 Kapitel 9. Tabel/en

selbst eine Gruppe, deshalb sind Fontwechsel und Zuweisungen in ihnen lokal. Aus dem gleichen Grunde konnen Gruppen nicht tiber einen Eintrag hinaus gebildet werden:

Falsch: $ . .. & {\ bf . .. & ... }... & ... $ Richtig: $ ... $ & $\bf. .. $ & ${\bf ... } ... $ & $ ... $

(Was zahlt, ist der gesamte Eintrag der Auflistung, nachdem # durch das entsprechende Material ersetzt wurde: Eine linke geschweifte Klammer in der Praambel kann also ihr rechtes Gegensttick im Tabellenkorper haben.)

Wir sahen, daB TPC jede Spalte so breit macht wie ihren breitesten Eintrag. Was pas­siert dann mit den anderen Eintragen? 1m wesentlichen wird der Glue, den sie enthalten, entsprechend gedehnt. In der letzten Version unserer Tabelle hatten die Eintrage tiber­haupt keinen Glue, so daB sie linksbtindig in einer unterbelegten Box erscheinen. Das ist harmlos, TEX beschwert sich dartiber nicht in einer Tabelle.

Diese Eigenschaften machen es einfach, rechtsbtindige oder zentrierte Spalten zu for­matieren; man braucht nur geeignete Springs in die Praambel einzufiigen.

\halign{ \hfil#\hfil&\quad\it#\hfil&

}

\hfil\quad#\cr \bf Name& \bf Typ& \bf Wert\cr $x$& ganze Zahl& 1987\cr $y$& reell& 3. 14159\cr $z$& Boolesch& falsch\cr

Name Typ x ganze Zahl y reell z Boolesch

Wert 1987

3.14159 falsch

(Wenn im Quelltext wie hier eine Zeile zu lang ist, urn in eine Zeile Ihres Editors zu passen, sollten Sie die Zeile direkt nach einem Et-Zeichen brechen - aus dem gleichen Grunde, aus dem Sie Leerzeichen nach, aber nicht vor einem Et-Zeichen lassen konnen.)

Die Kombination \hfil \ quad erscheint sooft, daB wir eine Abktirzung dafiir im Ma­kro-File definierten, der am Anfang eines jeden Laufes eingelesen wird (siehe dazu Ab­schnitt 1.7): \def\hfq{\hfil \quad}. Sie sollten Entsprechendes mit Konstruktionen, die Sie oft verwenden, tun. Es spart Zeit und reduziert die Fehlermoglichkeiten.

9.3 Einige nOtzliche Anregungen

Der \halign-Befehl kann nur im vertikalen Modus verwendet werden, da er einen Stapel horizontaler Boxen (die Zeilen) erzeugt. Wie immer, wenn Tpc Boxen stapelt, fiigt es automatisch etwas Glue dazwischen - der Grund dafiir, warum in der Tabelle von Ab­schnitt 9.2 die Zeilen so schon durchschossen waren (Leerraum zwischen ihnen gesetzt wurde), als ob es sich urn Zeilen in einem Absatz handelte. Wenn Tpc im gewohnlichen vertikalen Modus (d. h. nicht innerhalb einer Box) ist, nimmt es sich wie tiblich die Frei­heit. den Stapel flir einen Seitenurnbruch zu teilen. Urn dies zu vermeiden oder urn eine Tabelle im horizontalen Modus zu setzen, konnen Sie diese in einer vertikalen Box for­matieren: \vbox{\halign{ ... n.

Page 5: TEX Praxis || Tabellen

9.4 Die Behandlung von Spezialfallen 145

Es gibt eine Ausnahme von der vertikalen-Modus-Regel: \halign kann auch unmit­telbar im display-Mathematikmodus, also zwischen zwei doppelten Dollarzeichen $$, angewendet werden. Dies HiBt die Auflistung aber linkshlindig auf der Seite stehen, was selten erwunscht ist. Viel haufiger wird man

$$\vbox{\halign{ ... }}$$

eingeben, wodurch die Tabelle horizontal zentriert wird. Dies ist vielleicht die einfachste Weise, Tabellen zu zentrieren, aber es gibt noch viele andere, einschlieBlich solcher, die den \vbox-Befehl vermeiden und somit einen Seitenumbruch zwischen den Tabellenzei­len zulassen. Vergleichen Sie \tabskip in Abschnitt 9.12 flir Details.

Was Sie auch immer mit dem \halign-Makro vorhaben, Sie sollten den Code von auBen beginnend schreiben und zuerst den Rahmen eintippen:

$$\vbox{\halign{

}}$$

Erst danach sollten Sie die Zeilen einfiigen. Wenn Sie dies nicht tun, haben Sie nach unserer Erfahrung sehr gute Chancen, eine (oder beide) schlieBende Klammem zu verges­sen. Das Ergebnis ist in einem solchen Fall, daB TEX alles von da an als Teil der Auflistung ansieht und Sie eine Fehlermeldung wie

! You can't use '\end' in internal vertical mode.

erhalten. Oft vergiBt man auch das \ cr am Ende der letzten Zeile. Einige Makros wie matrix lassen Ihnen das durchgehen, weil sie die magische Kontrollsequenz \crcr, die die Auslassung kompensiert (Abschnitt 12.10), verwenden - aber \halign selbst ist nachtragend.

9.4 Die Behandlung von Spezialfallen Abkurzungen in der Praambel

Welte von x: 0 1 2 3 4 5 6 7 8 9 Welte von x 2 : 0 1 4 9 16 25 36 49 64 81

Diese Tabelle besitzt elf Spalten, von der ersten einmal abgesehen entsprechen aIle dem Modell \hfil#\quad. Urn diese Schablone nicht zehnmal eintippen zu mussen, konnen wir eine Abkiirzung verwenden:

\halign{ #\hfil\quad&&\hfil#\quad\cr

}

Werte von $x$: & 0& 1& 2& 3& 4& 5& 6& 7& 8& 9\cr Werte von $x-2$: & 0& 1& 4& 9& 16& 25& 36& 49& 64& 81\cr

Allgemein miissen # und & sich in der Praambel abwechseln, wobei ein # dem ersten & vorangehen solI. Die Abkiirzung besteht darin, ein zusatzliches & genau vor eine der Spaltenschablonen einzugeben; dies laBt TEX dann die dieser UnregelmaBigkeit folgende

Page 6: TEX Praxis || Tabellen

146 Kapitel 9. Tabel/en

Schablone sooft wiederholen, wie entsprechende Spalten im Tabellenkorper vorhanden sind. Eine Praambel der Form

A && B \cr,

wobei A und B fUr irgendwelche Ausdriicke stehen, in denen sich # und & abwechseln, ist aquivalent zu

A & B & B & B . .. \cr

und analog fUr eine Praambel der Form &E\cr.

Hier ist eine ubliche Anwendung; sie wird z. B. im \matrix-Makro (Abschnitt 11.25) verwendet. Wir wollen eine Tabelle konstuieren, in der aIle Spalten linksbtindig und durch \quad getrennt sind. Falls wir als Praambel &#\hfil \quad\cr schreiben, erhalten wir ein zusatzliches \quad nach der letzten Spalte, und wenn wir &\quad#\hfil \cr, einge­ben, so erhiilt die erste Spalte ein nicht gewolltes \quad. In beiden Fallen zeigt sich dieser Leerraum, wenn die Tabelle von einem Rahmen oder Klammem (wie bei Matritzen) um­geben sind. Die richtige Losung ist #\hfil&&\quad#\hfil \cr: Die erste Spalte besitzt keinen Leerraum, und jede folgende ist von der vorangehenden durch ein \quad getrennt.

Leere Eintrage

Tpc wird nicht mit der Wimper zucken, wenn eine Zeile weniger Eintrage als die Pra­ambel besitzt - es laBt die fehlenden Eintrage einfach vor dem \cr aus. Aber Vorsicht: toto&&&&&&\cr ist nicht gleich toto\cr. 1m ersten Fall werden die bestehenden Scha­blonen verwendet, wobei nur # durch nichts ersetzt wird; im zweiten Fall werden die Schablonen ubergangen.

\halign{ $#$&&\hfil\quad$#$\cr

1 1\cr

1 1 1&1\cr 1&2&1\cr

1 2 1

1&3&3&1\cr 1 3 3 1

1&4&6&4&1\cr 1 4 6 4 1

1&5&10&10&5&1\cr 1 5 10 10 5 1

}

Schablonen Obergehen

In der Beispieltabelle des Abschnitts 9.2 sind in der ersten Spalte aIle Eintrage bis auf einen im Mathematikmodus. Es ware schon, den Code weiter zu vereinfachen und \hfil$#$\hfil in die entsprechenden Schablonen zu schreiben, so daB die Dollarzei­chen nicht mehr in den einzelnen Eintragen eingegeben werden mussen.

Page 7: TEX Praxis || Tabellen

9.4 Die Behandlung von Spezialfallen 147

Wie gewohnt gibt es einen Weg, urn mit der aufsassigen Ausnahme fertig zu werden: Gibt man ganz am Anfang eines Eintrages \omi t ein, so wird fUr diesen Eintrag die entsprechende Schablone ignoriert.

\halign{ \hfil$#$\hfil&\quad\it#\hfil&

}

\hfil\quad#\cr \omit\bf Name&\bf Typ& \bf Wert\cr x& ganze Zahl& 1987\cr y& reell& 3. 14159\cr z& Boolesch& falsch\cr

Name Typ x ganze Zahl y reell z Boolesch

Wert 1987

3.14159 falsch

Sie mogen sich fragen, ob der Aufwand sich gelohnt hat - wir sparten keinen einzigen Anschlag. Aber wir machen es uns durch das Ausklammem eines gemeinsamen Merk­mals einfacher, dieses Merkmal spater, falls notwendig, zu andem. AuBerdem wird die Struktur der Tabelle dadurch klarer.

Obung

Setzen Sie diesen Fries als eine Auflistung mit drei Spalten, wobei die Eintrage im Tabellenkorper so kurz wie moglich sein sollen. Zum Beispiel sollte die mittlere Zeile durch 8&8&8\cr gegeben sein, wenn die TFC-Logos in der Mitte eines jeden V's urn 8 pt auseinanderstehen. (Sie sind an der Offnung des V's urn 35 pt getrennt, und die V's selbst sind durch zwei \quad getrennt.) Lesen Sie nicht weiter, bevor Sie es nicht versucht haben!

Hier ist eine Moglichkeit fUr die Praambel mit sich automatisch wiederholenden Scha­blonen, die den Leerraum zwischen den Spalten gleich zwischen links und rechts aufteilen (denken Sie daran, daB \hfq fur \hfil \quad steht):

&\hfq\TeX\hskip#pt\TeX\hfq\cr

Diese Schablonen funktionieren fUr den Fries ohne die Spitzen der V's. In der ersten Zeile steht ... &35& ... \cr und in der dritten 35& ... &35\cr. Fur die Spitze verwenden wir \omit, urn die Schablone zu umgehen, und geben ein einziges, zentriertes TFC-Logo ein:

\halign{ &\hfq\TeX\hskip#pt\TeX\hfq\cr \omit\hfq\TeX\hfq& 35&

8& 8& 35& \omit\hfq\TeX\hfq&

}

\omit\hfq\TeX\hfq\cr 8\cr 35\cr

Page 8: TEX Praxis || Tabellen

148 Kapitel 9. rabel/en

Es ist sehr wichtig, daB das der \omit-Befehl direkt am Anfang des Eintrages steht (eventuell nach Leerzeichen; diese werden ignoriert): TEX sucht nur dort nach diesem Befehl. Findet TEX dort etwas anderes, so wird es in der Schablone eingebaut.

9.5 Besonders breite Eintrage

Werk

Montesquieu Considerations Voltaire Essai sur les Mreurs Hume History of England Gibbon Decline and Fall

Erscheinungsjahr

1734 1745 1754 1776

In dieser Tabelle, deren Praambel #\hfil \qquad&\hfil#\cr lautet, ist der oberste Eintrag der rechten Spalte viel breiter als die anderen. TEX's Standardverhalten, die Ein­trage die Spaltenbreite bestimmen zu lassen, ftihrt zu exzessivem Leerraum. Urn die Ta­belle besser auszubalancieren, mochten wir den langen Eintrag in die benachbarte Spalte iiberhangen lassen.

Die Idee besteht darin, TEX dariiber hinwegzutauschen, daB der Eintrag der weiteste ist, indem man ihm eine negative Breite gibt. Jede negative Angabe ist dabei moglich, denn eine negative Zahl ist kleiner als eine positive. Sicherheitshalber addieren wir gleich -1000 pt Leerraum links am Eintrag; denken Sie daran, daB dort schon als Teil der Scha­blone ein \hfil steht, das iiberschiissigen negativen Glue streicht:

\bf Werk& \hskip -1000pt \bf Erscheinungsjahr\cr

Werk Erscheinungsjahr

Montesquieu Considerations 1734 Voltaire Essai sur les Mreurs 1745 Hume History of England 1754 Gibbon Decline and Fall 1776

Plain-TEX's \hidewidth-Kontrollsequenz macht diese Idee amtlich; es kombiniert \hskip-l000pt mit ein \hfill, so daB Sie es auch verwenden konnen, wenn die Scha­blone keine Spring enthalt. Wenn Sie \hidewidth am Anfang eines Eintrages setzen, so kann der Text folglich links iiberhangen, setzen Sie \hidewidth am Ende eines Eintra­ges, so kann er rechts iiberhangen.

9.6 Material zwischen Zeilen einfOgen

Die Konstruktion ... \cr\noalign{ ... }, in der das Material in den geschweiften Klammem alles sein kann, was im vertikalen Modus erlaubt ist, ftigt dieses Material zwi­schen den Zeilen einer Auflistung ein. Sie konnen mehrere \noalign in einer Tabelle verwenden, aber sie miissen alle unmittelbar nach dem \cr kommen, das die vorherige Zeile abschlieBt (oder die Praambel): Woanders sind sie nicht sinnvoll.

Page 9: TEX Praxis || Tabellen

9.6 Material zwischen Zeilen einfOgen 149

Lassen Sie uns, als ein Beispiel, unsere Lieblingstabelle durch horizontale Linien - die die Titelreihe vom Rest abheben sollen - aufbessem.

\halign{ \hfil$#$\hfil&\quad\it#\hfil&

\hfil\quad#\cr \noalign{\hrule\smallskip} \omit\bf Name&\bf Typ& \bf Wert\cr \noalign{\smallskip\hrule\smallskip} x& ganze Zahl& 1987\cr y& reell& 3.14159\cr z& Boolesch& falsch\cr \noalign{\smallskip\hrule} }

Name Typ

x ganze Zahl y reell z Boolesch

Wert

1987 3.14159

falsch

Die \smallskip sind notwendig, weil TEX keinen Zwischenraum tiber oder unter ei­ner Linie einftigt. Die \hrule sind gerade lang genug, urn sich tiber die Auflistung zu erstrecken, da wir ihre Lange nicht spezifiziert haben; als ob die Tabelle eine umhtil­lende \ vbox ware. Aber anderes Material, das eine feste Breite besitzt, wird sich nicht der Tabelle anpassen - es wird einfach linksbtindig ausgerichtet und zwischen den Zeilen gestapelt.

Urn dies zu verstehen, betrachten wir den folgenden Versuch, eine zentrierte Auflistung zu erzeugen:

$$\vbox{\halign{ #\hfil&&\quad#\hfil\cr Alk& Blegans& Carrikersittich& Dronte& Elsterling\cr Aubergine& Brokoli& Chicoree& Daikon*& Endivie\cr \noalign{\smallskip\hrule\smallskip} \noalign{*Japanischer Rettich.}

}}$$

Das geht daneben, die Tabelle wird linksbtindig, nicht zentriert, gesetzt:

Alk Ble gans Carrikersittich Dronte Aubergine Brokoli Chicoree Daikon*

* Japanischer Rettich.

Elsterling Endivie

Was ist passiert? Verfolgen wir TEX's Schritte zurUck. TEX begann im vertikalen Mo­dus und setzte zwei Zeilen; dann traf es auf die \noalign-Befehle, die unabhangig von der Tabelle gesetzt werden. Der vertikale Glue und die horizontale Linie sind Material des vertikalen Modus, und beeinfluBen die Breite nicht; aber als TEX zur FuBnote kam, muBte es einen neuen Absatz beginnen, einen Erstzeileneinzug durchftihren usw.! Wie Sie wissen, sind die Zeilen darin \hsize breit, so daB TEX also linksbtindig die relativ schmale Tabelle auf eine Zeile, die so breit wie der Textbereich der Seite (\hsize) ist, setzt. Kein Wunder, daB das Ergebnis nicht zentriert erscheint - es ist kein Platz tibrig, urn die Tabelle zu zentrieren!

Page 10: TEX Praxis || Tabellen

150 Kapitel 9. Tabel/en

Der richtige Weg, ein solches Problem zu lOsen, ist immer, den Text in einer hori­zontalen Box zu setzen: \noalign{\hbox{ *Japanischer Rettich.}} Die Breite der umfassenden vertikalen Box wird dann gleich der Breite der Auflistung oder der Breite der in \noalign eingesetzten \hbox sein - je nachdem, welche groBer ist.

Wir werden in den nachsten Abschnitten \noalign noch wiederholt einsetzen. Weitere Anwendungen finden sich auch im Glossar.

9.7 Spalten vereinigen Die Konstruktion \mul tispan n{ . .. } laBt das Material in den geschweiften Klam­

mem sich tiber die nachsten n Spalten der Tabelle erstrecken. Die Schablonen dieser Spal­ten werden ignoriert, als ob die jeweiligen einzelnen Eintrage mit \omi t begonnen hatten. (Das ist es, was \multispan tatsachlich tut: die \omit an die richtige Stelle setzen.) In der Tabelle

STRASSBURGER MARKT

Artikel Herkunft Preis pro kg Gewicht

Artischocken St. Pol de Leon 9,40F 100kg Aprikosen Kiwis

................ demniichst . .............. . Neuseeland 14,OOF 30kg

fassten wir alle vier Eintrage der ersten Zeile zu einem zusammen (den Titel) und ebenso die letzten drei Eintrage der vierten Zeile. Hier ist der Code, den wir verwendeten:

\halign{

}

#\hfil& \quad #\hfil& \hfil\quad#& \hfil\quad#\cr \multispan4\hfil\bf STRASSBURGER MARKT\hfil\cr \noalign{\medskip} \bf Artikel& \bf Herkunft& {\bf Preis pro kg}& \bf Gewicht\cr \noalign{\smallskip} Artischocken&St.-Pol de L\'eon& 9,40F& 100kg\cr Aprikosen&\multispan3\quad\it\dotfill demn\"achst\dotfill\cr Kiwis& Neuseeland& 14,OOF& 30kg\cr

Der \mul tispan4-Befehl erscheint am Anfang der ersten Zeile des Tabellenkorpers von \halign, deshalb ersetzt es die Eintrage 1 bis 4. Die entsprechenden Schablonen werden tibersprungen, sie konnten uns sowieso nicht ntitzlich sein, da wir den Titel zen­triert haben wollen. Beachten Sie, daB der Text nach \mul tispan4 nicht in geschweiften Klammem stehen muB.

Der \multispan3-Befehl arbeitet analog. Er erscheint direkt hinter dem ersten & der vierten Zeile, d. h. anstelle der Eintrage 2 bis 4. Wieder werden die Schablonen tibersprun­gen, aber das \quad am Anfang der zweiten Schablone ist wichtig, urn die Ausrichtung zu wahren, deshalb muBten wir es in den Eintrag kopieren. Beachten Sie auch den Gebrauch von \dotfill anstelle von \hfil aufbeiden Seiten des Textes.

Page 11: TEX Praxis || Tabellen

9.8 Zahlen auflisten 151

Einige Punkte, die Sie sich merken sollten:

• Schreiben Sie \mul tispan3, so verbinden Sie drei Eintrlige, iiberspringen also nur zwei Et-Zeichen.

• \mul tispan muB genau wie \omi t am Anfang eines Eintrages stehen - ansonsten erhlilt TEX die Order, die Schablone zu tiberspringen, nachdem es schon angefangen hat, sie zu verwenden, und gerlit ins Trudeln.

• Wenn Sie nach \multispan3 ein Leerzeichen lassen, wird es auch gesetzt, und es macht sich bemerkbar, wenn Ihr Eintrag linksbiindig ausgerichtet ist oder mit \dotf ill oder Ahnlichem beginnt. Schreiben Sie stattdessen \multispan3\dotfill.

• Wenn Sie mehr als 9 Spalten verbinden, miissen Sie die Anzahl in geschweifte Klammem setzen, z. B. \mul t ispan{14}

• \multispanl ist synonym zu \omit.

9.8 Zahlen auflisten Artikel

Artischocken Aprikosen Kiwis

Endsumme

Preis (F jkg) Gewicht (kg)

9,40 100 7,30 12

14,00 30

Gesamt (F)

940,00 87,60

420,00

1467,60 F

Betrachten Sie sorgfaltig die Ausrichtung der Zahlen in dieser Tabelle. Ais Gruppe sind die durch Zahlen gebildeten Spalten beziiglich der Uberschrift zentriert, da TEX dies nicht automatisch tut. Die dort gewlihlte Losung, \smallskip einzufligen, laBt noch Wtinsche offen. Sie legt den Abstand zwischen der unteren bzw. oberen Zeilenkante und der Li­nie fest. Allgemein ist es aber wtinschenswert, den Abstand zwischen der Linie und der Grundlinie der Zeile zu bestimmen. In unserem Beispiel ist der Abstand zwischen der Linie und der Grundlinie der ersten Zeile groBer als der entsprechende Abstand beztiglich der letzten Zeile. Denn die erste Zeile besitzt - im Gegensatz zur zweiten - Buchstaben mit Unterlange wie "y", nicht aber die letzte.

Ein allgemeiner Zugang zur Losung dieses Problems basiert auf dem wichtigen Kon­zept der Stiitze, die wir schon kurz in Abschnitt 8.12 angesprochen haben. Eine Stiitze ist unsichtbar, aber so hoch und tief, daB sie die Formatierung in der Zeile, in der sie angewendet wird, maBgeblich beeinfluBt. Wenn jede Zeile eine Sttitze enthalten wtirde, brauchte man keinen DurchschuB, urn die Zeilen zu trennen, weil sie die Hohe und Tiefe der Sttitzen ererben und somit ihre Grundlinien durch einen festen Abstand voneinander getrennt sind. (Dies gilt nur, wenn die Sttitzen die hochsten und tiefsten Bestandteile ihrer Zeile sind, was normalerweise der Fall ist. Aber falls Sie komplexe Formeln mit Brtichen oder groBen Indizes haben, mag dies nicht mehr immer wahr sein, und die Angelegenheit wird komplizierter.)

Plain-TEX definiert das \strut-Makro (siehe unten) im wesentlichen als eine Linie der Breite Null, der Hohe 8,5 pt und der Tiefe 3,5 pt. Das bedeutet flir zwei aufeinanderfol­gende Zeilen in einer Tabelle, die Sttitzen, aber keinen Zwischenraum besitzen, daB ihre

Page 12: TEX Praxis || Tabellen

152 Kapitel 9. Tabel/en

Grundlinien 12 pt voneinander entfemt sind: Das entspri~ht genau dem normalen Wert von \baselineskip.

\vbox{\offinterlineskip\halign{ \strut#&\hfil$#$\hfil&

}}

\quad\it#\hfil&\hfil\quad#\cr \noalign{\hrule} &\omit\bf Name&\bf Typ&\bf Wert\cr \noalign{\hrule} &x& ganze Zahl& 1987\cr &y& reell& 3. 14159\cr &z& Boolesch& falsch\cr &TEX& Makro& \TeX\cr \noalign{\hrule}

Name x y z

\TeX

Typ Wert ganze Zahl 1987 reell 3.14159 Boolesch falsch Makro 'lEX

Hier verwendeten wir \offinterlineskip, urn einen DurchschuB innerhalb unser \vbox zu unterdriicken, und ein \strut wurde in die Praambel gesetzt, so daB es injeder Zeile der Tabelle wiederholt wurde. (Wie Sie sehen, konnen mit dieser Technik auch etwas ausgefallenere Falle wie in der vierten Zeile noch formatiert werden.) Damit wird der Abstand der Grundlinie der ersten Zeile zur darauffolgenden Linie genauso groB wie der Abstand (der Grundlinie) der vierten Zeile zur ihrer unteren Linie. Die Stiitze hatte in jeder Spalte funktioniert, aber wir setzten sie in eine eigene Spalte, unabhangig von den anderen Eintragen: Hatten wir sie etwa in die "Name"-Spalte geschrieben, so hatten wir sie auch zusatzlich noch in den Eintrag kopieren miissen, der mit \omi t beginnt.

Die meisten Leser werden den Abstand zwischen Grundlinie und Linie als ungenii­gend empfinden. Urn ihn zu vergraBem, kannten wir das \strut-Makro haher und tiefer umdefinieren:

\vbox{\offinterlineskip Name Typ Wert

\def\strut{\vrule height 10.5pt depth 5.5pt width Opt} x ganze Zahl 1987

\halign{ y reell 3.14159 . .. hier keine Anderungen

z Boolesch falsch }}

(Beachten Sie, daB die neue Definition von \strut wie auch die Wirkung des Makros \offinterlineskip auf den Bereich der \vbox beschrankt ist.) Das funktioniert gut, falls alle Zeilen durch Linien getrennt sind, aber hier fiihrt es zum entgegengesetzten Problem: Die Zeilen, die nicht durch Linien getrennt sind, werden zu weit auseinander gesetzt. Das Beste scheint eine Doppellasung zu sein:

• Einerseits wird der \strut-Befehl in seiner Standardform verwendet,

Page 13: TEX Praxis || Tabellen

9.8 Zahlen auf listen 153

• zusatzlich werden die \h1 ine-Befehle mit einem \ vski p von 2pt versehen.

\vbox{\offinter1ineskip\ha1ign{ \strut#&\hfi1$#$\hfi1&\quad\it#\hfi1&

\hfil \quad#\cr \noa1ign{\hru1e\vskip 2pt} Name Typ Wert \omit\bf Name& \bf Typ& \bf Wert\cr \noa1ign{\vskip 2pt\hru1e\vskip 2pt} x& ganze Zah1& 1987\cr

x y

ganze Zahl reell

1987 3.14159

y& ree11& 3. 14159\cr z Boolesch falsch

z& Boo1esch& fa1sch\cr \noa1ign{\vskip 2pt\hru1e}

}}

Einen anderen Weg bietet Plain-TfY( mit dem \openup-Makro an, das den Abstand zwischen den Zeilen einer Tabelle, in denen der DurchschuB nicht abgestellt wurde, er­hoht. Das ist im Display-Mathematikmodus, mit dem \eqalign-Makro und seinen Ver­wandten, sehr ntitzlich. Durch

{\openup 3pt\ha1ign{ ... }}

erhohen Sie im Grunde \base1inskip urn 3 pt. Urn Wirkung zu zeigen, sollte das Makro \openup auBerhalb der Tabelle angewendet werden: Mit \halign{\openup3pt ... } klappt es nicht. Andererseits sollte es in einer Gruppe eingeschlossen sein - vielleicht in einer \ vbox, die die gesamte Tabelle umschlieBt -, urn nicht den Zeilenabstand des normalen Textes zu stOren.

Es gibt also mehrere Moglichkeiten, den Abstand der Zeilen in einer Tabelle zu veran­dem:

• \noalign{\vskip ... } laBt Sie den Leerraum zwischen einzelnen Zeilen kontrol­lieren und funktioniert unabhangig davon, ob Sie \offinterlineskip setzen oder nicht.

• \strut in der Praambel, zusammen mit \offinter1ineskip vor der Tabelle, macht aIle Zeilen gleich hoch und tief und ebenso die AbsUinde zwischen den Grund­linien gleich. Diese Kombination ist besonders dann ntitzlich, wenn sich Linien zwischen den Zeilen befinden.

• \strut in Zeilen, die eine besondere Formatierung - z. B. aufgrund von Exponenten oder Indizes - erforderlich machen. Hierbei muB die verwendete Stiitze der Situation entsprechend angepaBt werden, und es werden nur einzelne Zeilen modifiziert.

• \openup vor einer Tabelle andert den Abstand zwischen den Grundlinien ftir aIle Zeilen. Das ist normalerweise nur dann sinnvoll, wenn man den \offinterlineskip­Befehl nicht verwendet (vgl. aber dazu auch Abschnitt 9.11).

Linien, die sich iiber einzelne Spalten erstrecken Wir wissen jetzt, wie wir \noalign einzusetzen haben, urn Linien tiber die Breite ei­

ner Tabelle zu ziehen. Aber was ist mit Linien, die sich nur tiber einige Spalten erstrecken sollen? Die Losung besteht darin, die Linie als Teil eines Eintrags wie die Auspunktie­rung en in Abschnitt 9.8 zu behandeln. Ftir eine Spalte reicht \omi t \hru1efill aus.

Page 14: TEX Praxis || Tabellen

154 Kapitel 9. Tabel/en

Fur drei Spalten konnen Sie \omi t\hrulefill dreimal schreiben oder die Abkurzung \multispan3\hrulefill verwenden.

Denken Sie daran, daB diese kurzen Linien als Bestandteile reguHirer Zeilen in Boxen gepackt werden, bevor TEX sie ubereinanderstapelt. Das bedeutet, daB Sie den automati­schen DurchschuB mit \offinterlineskip unterdriicken miissen. Sie setzen dann Stiit­zen ein, urn den Zwischenrraum manuell zu bestimmen, falls Sie irgend einen besonders gearteten Leerraum erhalten wollen. Hier ist ein typisches Beispiel, das Sie sorgfiiltig studieren sollten:

\vbox{\offinterlineskip\def\hfn{\hfil\enspace} \def\strut{\vrule height9pt depth3pt widthOpt} \halign{

\hfn#\hfn&\strut\hfn#\hfn&\hfn#\hfn\cr

}}

&\omit\hrulefill& \cr & T& \cr

\multispan3\hrulefill\cr T& E& X\cr \multispan3\hrulefill\cr & X& \cr &\omit\hrulefill& \cr

T T E X

X

Urn sich zu vergewissem, daB Sie alles verstanden haben, versuchen Sie zu erkliiren, was in den folgenden Variationen schiefgelaufen ist:

T

T E X

X

\offinterlineskip und \strut entfemt

Il'Ix

\strut entfemt

T T E X

X

\strut in die erste Spalte verschoben

Was geschieht eigentlich, wenn Sie anstelle des \hrulefill-Befehl einen anderen, auf dem \leaders-Makro basierenden Befehl einsetzen, z. B. \dotfill?

Page 15: TEX Praxis || Tabellen

9.9 Vertikale Linien

\vbox{\offinterlineskip\def\hfn{\hfil\enspace} \def\strut{\vrule height9pt depth3pt widthOpt} \halign{ \hfn#\hfn&\strut\hfn#\hfn&\hfn#\hfn\cr

&\omit\dotfill& \cr & T& \cr \multispan3\dotfill\cr T& E& X\cr \multispan3\dotfill\cr & X& \cr &\omit\dotfill& \cr

}}

155

T T E X ...........

X

Wie Sie sehen, ist mit dieser Methode der Formatierung eine ganz einfache Maglichkeit zur Variation der Tabelle gegeben.

9.9 Vertikale Linien Der einfachste Weg, vertikale Linien innerhalb von \halign-Ausrichtungen zu setzen,

ist, sie aus kurzen Stticken, jedes davon in einer Zeile, zusammenzusetzen. Die Abbildung tiber die Zerlegung einer Tabelle in ihre Einzelteile an Anfang dieses Kapitels illustriert diese Idee.

Das hart sich anfangs recht mtihselig an, aber es zeigt sich, daB es sehr einfach ist, da wir schon aIle Bausteine vorratig haben. Jede Tabelle mit \offinterlineskip, also jene, die auf Sttitzen basieren, die ihre Struktur unterstiitzen, ist sofort flir vertikale Li­nien aufnahmebereit. Der Trick besteht darin, \ vrule an geeigneten Stellen in der Pra­ambel zu plazieren. Dies ergibt vertikale Linienstticke, die nahtlos aneinanderpassen, da ein \ vrule, des sen vertikale Dimension nieht spezifiziert wurde, sich vertikal bis an die Grenzen der umgebenden Box ausdehnt. Hier kommt der Quelltext der ersten Tabelle des Abschnitts 9.9 mit vertikalen Linien:

\vbox{\offinterlineskip\halign{

}}

\strut#&\vrule#\quad& \hfil$#$\hfil& \quad\vrule#\quad& \it#\hfil&\quad\vrule#\quad& \hfil#&\quad\vrule#\cr

\noalign{\hrule} &&\omit\bf Name&&

\bf Typ&&\bf Wert&\cr \noalign{\hrule} &&x&& ganze Zahl&& 1987 & \cr &&y&& reell&& 3.14159& \cr &&z&& Boolesch&& falsch & \cr \noalign{\hrule}

Name x y z

Typ Wert ganze Zahl 1987 reell 3.14159 Boolesch falsch

Die Eintriige selbst blieben unangetastet! Anderungen wurden nur in der Praambel vorgenommen: Ftir jedes \ vrule wurde eine Schablone mit umgebendem Leerraum ein­geflihrt. Die entsprechenden Eintrage im Tabellenkarper sind aIle leer, wir fligten nur die

Page 16: TEX Praxis || Tabellen

156 Kapitel 9. rabel/en

notwendigen Et-Zeichen ein. Eigene Spalten flir \vrule-Eintrage sind nicht unbedingt notwendig, insbesondere, wenn keine \omi t vorhanden sind, aber es ist eine gute Ange­wohnheit, wenn man die Dinge auseinanderhalt.

Mit diesem Verfahren ist es nattirlich auch sehr leicht moglich, verschieden dicke Li­nien in der Tabelle einzusetzen:

\vbox{\offinterlineskip\halign{

}}

\strut#&\vrule#\quad& \hfil$#$\hfil& \quad\vrule width 2pt#\quad& \it#\hfil&\quad\vrule#\quad& \hfil#&\quad\vrule width.5pt #\cr \noalign{\hrule}

&&\omit\bf Name&& \bf Typ&&\bf Wert&\cr

\noalign{\hrule} &&x&& ganze Zahl&& 1987 & \cr &&y&& reell&& 3.14159& \cr &&z&& Boolesch&& falsch & \cr \noalign{\hrule}

Name Typ Wert x ganze Zahl 1987 y reell 3.14159 z Boolesch falsch

Und nun zum groBen Finale: die perfekte Tabelle, mit der wir dieses Kapitel begannen. Wir mussen wie in Abschnitt 9.9 ein biBchen Leerraum uber und unter den horizontalen Linien einfligen. Aber wir konnen nicht mehr \noalign{\vskip 2pt} schreiben, weil dies die vertikalen Linien unterbrechen wurde. Statt dessen werden wir kleine "Zeilen", nur 2 pt hoch, einftigen, die nur Stucke vertikaler Linien enthalten! Die Hohe dieser Mini­Linien kann bequem durch einen Eintrag height 2pt im Tabellenkorper gesetzt werden: Weil in der Schablone auf \vrule direkt ein # folgt, sieht TEX dann \vrule height 2pt. AuBerdem muB dies nur einmal pro Zeile getan werden, die anderen Linien leihen sich die Hohe der hochsten Linie, et voila:

\vbox{\offinterlineskip \def\mr{\omit&height 2pt&&&&&&} \halign{

Name Typ Wert

\noalign{\hrule} \mr x ganze Zahl 1987 y reell 3.14159

\mr \noalign{\hrule} \mr z Boolesch falsch

\mr \noalign{\hrule} }}

Die Praambel ist hier ungewohnlich kompliziert, weil jede Spalte yom typographischen Standpunkt aus anders behandelt werden muBte. Sonst kann man oft abgekurzte Praam­beln, wie in Abschnitt 9.4 erklart, verwenden.

Page 17: TEX Praxis || Tabellen

9. 10 Tabel/en und geschweifte Klammern

Obung Setzen Sie das reehte Muster. Die kleinen Quadrate haben die

SeitenUinge 18 pt (die Dieke der Linien nicht eingerechnet), und die Buehstaben sitzen 6 pt tiber dem Boden der Quadrate.

{\offinterlineskip\rm \def\vdim{height 12pt depth 6pt} \def\hrul{\hrulefill} \halign{\vrule#&&\hbox to 18pt{\hfil#\hfil}&\vrule#\cr &\hrul& &\hrul& &\hrul&\cr & & & T& & &\vdim\cr &\hrul& & & &\hrul&\cr & T&\omit& E&\omit& X&\vdim\cr &\hrul& & & &\hrul&\cr & & & X& & &\vdim\cr &\hrul& &\hrul& &\hrul&\cr}}

9.10 Tabellen und geschweifte Klammern

157

Die \downbracefill und \upbracefill-Makros, die geschweifte Klammem dyna­mischer Breite erzeugen (Abschnitt 5.8), funktionieren auch in TabelIen:

a ... g ~ __________ ~A~ __________ ~

A

b ... d d ... f .---..---. BCD E F G

a ... C ~

e ... g

Hier ist der Code fUr das Beispiel:

\vbox{\offinterlineskip\openup 6pt

}}

\halign{&\quad#\quad\cr \multispan7\hfil a \dots\ g\hfil\cr \multispan7\quad \downbracefill \quad\cr &\multispan5\quad\hfil b \dots\ d\hfil

\thinspace\hfil d \dots\ f\hfil\quad\cr &\multispan5\quad\downbracefill

\thinspace\downbracefill\quad\cr A&B&C&D&E&F&G\cr \multispan3\quad\upbracefill\quad&

&\multispan3\quad\upbracefill\quad\cr \multispan3\hfil a \dots c\hfil&

&\multispan3\hfil e \dots\ g\hfil\cr

Page 18: TEX Praxis || Tabellen

158 Kapitel 9. Tabel/en

Es sind einige Punkte erwahnenswert:

• Indem wir \ofiinterlineskip\openup 6pt eingaben, haben wir den Abstand zwischen den Zeilen tiberall effektiv 6 pt groB gemacht. Das ist das gleiche, als ob wir \lineskip=6pt und die Variable \lineskiplimit derma~en tibertrieben hoch gesetzt hatten, daB diese nie erreicht wtirde: vgl. die Diskussion in Abschnitt 8.9.

• Durch die \quad auf beiden Seiten der Klammem schaffen wir es, daB sie nur die Buchstaben umklammem, tiber deren Spalten sie sich erstrecken, und nicht dariiber hinaus. Ohne die \quad wtirden sie sich bis zu den (nicht sichtbaren) Grenzen der Spal­ten ausdehnen. Die beiden mittleren Klammem muBten im gleichen \multispan gesetzt werden, da sie sich das "D" teilen.

• Ein ahnliches Schema zentriert die Buchstaben bzgl. ihrer Klammem. Sehen Sie sich die dritte Zeile genauer an: Urn b . .. d zu zentrieren, verlassen wir uns darauf, daB \hfil b \dots\ d\hfil die gleiche Breite besitzt wie die zugehorigen Klammem.

Plain-TEX definiert \upbracefill und \downbracefill mit Hilfe von \vrule-Be­fehlen unspezifizierter Hohe und Tiefe - ja, tatsachlich \ vrule trotz der Tatsache, daB sie sich horizontal ausdehnen. Aus diesem Grunde ist ein Desaster vorprogrammiert, wenn Sie sie zusammen mit irgend etwas, das Hohe oder Tiefe besitzt, in die gleiche \hbox, Zeile oder den gleichen Tabelleneintrag stecken:

\hbox to 1in{\upbracefill \strut} ........................ ~ \hbox to lin{j \downbracefill} ........................... i ... _ ........ _ .....

Falls absolut notwendig, konnen Sie \smash verwenden, urn die Hohe irgendeines Ma­terials TEX gegentiber zu verheimlichen.

Dieser Effekt tritt mit den Makros der aktuellen Version (3.141592) von Plain-TEX nicht mehr auf. Dart werden die \upbracefill- und \downbracefill-Makros so defi­niert, daB die korrekte Dicke flir die waagerechten Linien eingestellt wird:

\hbox to iin{\upbracefill \strut} ........................ ''--......... v.----''

\hbox to lin{j \downbracefill} ........................... i,.....----''---.,

In Abschnitt 11.19 steht ein Beispiel flir den Gebrauch von vertikalen Klammem in einer Tabelle.

9.11 Die Breite einer Tabelle festlegen

Genau wie man mit \hbox to ... von auBen die Breite einer horizontalen Box fest­legt, konnen Sie die Breite einer Tabelle im voraus angeben. Auch hier wird TEX ver­suchen, Ihrer Forderung durch Dehnen und Stauchen des verftigbaren Glue zu gentigen. Aber welchen Glue? Der Glue in den einzelnen Eintdigen wurde verwendet, urn die Ein­trage der Spaltenbreite anzupassen - er ist schon "verbraucht".

Aber TEX halt zusatzlichen Glue zwischen den Spalten bereit. Dieser Glue, der mit der \tabskip-Variablen festgelegt wird, hat bisher noch keine Beachtung gefunden, aber er erweist sich als ein sehr flexibles Werkzeug.

Page 19: TEX Praxis || Tabellen

9. 11 Die Breite einer Tabel/e festlegen 159

Wir starten mit einer einfachen Auflistung mit nur zwei Zeilen und drei Spalten. Das Breiteste in jeder Spalte ist \showcol, das als

\hbox to lin{\leftarrowfill\hskip -lem\rightarrowfill}

definiert ist und anzeigt, wo sich die Spaltengrenzen befinden.

\vbox{\offinterlineskip \halign{

#&#&#\cr \noalign{\hrule\vskip 2pt} \strut\hfil Mitte\hfil&Links\hfil&\hfil Rechts\cr \showcol&\showcol&\showcol\cr

}}

Mitte Links Rechts II II

Was passiert, wenn wir \halign durch \halign to \hsize ersetzen? Nicht viel, au­Ber, daB TJY( sich tiber eine Underfull \hbox beschweren wird. Die \hrule-Linie am Kopf dehnt sich tiber die Seite aus, aber wie wir wissen, ist sie kein richtiger Bestandteil der Tabelle. Sonst tut sich nichts, da es keinen Glue zum Dehnen gibt.

Mitte Links Rechts ~--------~I~I----------~»~I----------~

\halign to \hsize{ ... }

Ais Nachstes geben wir \tabskip einen nicht verschwindenden Wert, lassen aber der Tabelle ihre nattirliche GroBe:

Mitte Links Rechts

\tabskip=.2in \halign{ ... }

Sie konnen an der oberen Linie, die sich tiber die gesamte Tabellenbreite ausdehnt, sehen, daB TJY( nicht nur Leerraum zwischen die Spalten, sondem auch am linken und rechten Rand der Tabelle einfiigt.

So weit, so gut; aber wir haben es noch nicht geschafft, daB die Tabelle so breit wie die Seite ist. Urn dies zu erreichen, mtissen wir \tabskip etwas Dehnbarkeit geben:

Mitte Links Rechts )

\tabskip=.2in plus .5in \halign to \hsize{ ... }

Nun sind wir auf dem richtigen Weg. Wie werden wir aber den Leerraum am rechten und linken Rand los? Es zeigt sich, daB \ tabskip einfach geandert werden kann und der Zwischenraum entsprechend reagiert:

Page 20: TEX Praxis || Tabellen

160 Kapitel 9. Tabel/en

• Der Wert, den \tabskip besitzt, wenn das Et-Zeichen zwischen zwei Schablonen gelesen wird, ist der Wert, der fUr den Leerraum der entsprechenden Spalten verwendet wird.

• Der Wert am Anfang der Praambel wird fUr den Leerraum an der linken Seite, und • der Wert am Ende der Praambel wird fUr den Leerraum an der rechten Seite der

Tabelle verwendet.

Hier ist die Tabelle mit Leerraum zwischen den Spalten, aber nicht davor oder dahinter:

Mitte Links Rechts

\tabskip=Opt\halign to \hsize{ \tabskip=.2in plus .5in #&#&#\tabskip=Opt\cr ... }

Wenn Sie so den Glue zwischen den Spalten verwenden, miissen Sie in der Praambel nicht \quad und ahnliches angeben, insbesondere wenn Ihre Tabelle vertikale Linien ent­halt, ist dies von Nutzen. Das ist ein weiterer Grund, warum vertikale Linien in eigene Spalten geschrieben werden sollten. Vereinfachen wir also die sperrige Praambel aus Ab­schnitt 9.10:

\tabskip=Opt\halign{ \strut#& \vrule#\tabskip=lem& \hfil$#$\hfil& \vrule#& \it#\hfil&\vrule#& \hfil#& \vrule#\tabskip=Opt\cr ... }

(Denken Sie daran, daB \quad eine Abkiirzung fUr \hskip lem ist.) Mit minimalem Aufwand konnen Sie nun die Tabelle auf eine gewiinschte Breite bringen:

\halign to .6\hsize{\tabskip=Opt \strut#& \vrule#\tabskip=1em plus 1in& ... }

ergibt:

Name Typ Wert

x ganze Zahl 1987 y reell 3.14159 z Boolesch falsch

9.12 Vertikaler Tabellensatz Nicht alle Tabellen sollte man als Aufeinanderstapelung von Zeilen ansehen, einige

werden sinnvoller als eine Nebeneinanderstellung von Spalten beschrieben:

Abel Barbara Christoph Diana Agnes Bernhard Claudia Dominik Amanda Bertold Cornelia Andrea Brigitte Arnold

Zugegeben, diese Tabelle konnte man mit \halign setzen. Aber stellen Sie sich den Aufwand vor, den Sie betreiben miiBten, urn Achim zwischen die ersten beiden Eintrage

Page 21: TEX Praxis || Tabellen

9. 12 Vertikaler Tabellensatz 161

der ersten Spalte einzufligen! Uberhaupt, wenn Sie die "A-Worter" in Gedanken zusam­menfassen konnen, sollten Sie sie auch zusammen codieren konnen.

Natiirlich kann man das. Es iiberrascht Sie wahrscheinlich nicht, daB \halign (mit dem "h" im Namen) ein vertikales Gegenstiick besitzt: \valign. Die beiden Befehle sind in jeder Beziehung dual, deshalb wissen Sie eigentlich schon alles tiber \ valign; aber da einige Folgen dieser Dualitat alles andere als offensichtlich sind, sehen wir uns einige Beispiele an.

Der Code fUr die obige Tabelle ist

\valign{&\hbox{\strut\quad#}\cr Abel&Agnes&Amanda&Andrea&Arnold\cr Barbara&Bernhard&Bertold&Brigitte\cr Christoph&Claudia&Cornelia\cr Diana&Dominik\cr}

Genau wie in TJY('s Augen die natiirliche Umgebung flir \halign der vertikale Modus ist, so ist es der horizontale Modus flir \valign. Deshalb verwenden wir \centerline, urn die Tabelle zu zentrieren. Doppelte Dollarzeichen $$ funktionieren auch, wobei man als VorsichtsmaBnahme \valign in eine \hbox packen sollte.

Natiirlich trennt & Eintrage in derselben Spalte, und \cr trennt Spalten. Die Praambel arbeitet genauso wie die Praambel eines \halign; hier verwenden wir die Abkiirzung von Abschnitt 9.4, urn zu vermeiden, daB wir dieselbe Schablone mehrere Male eintippen zu miissen.

Einige grundlegende Fakten zu \ valign

• Jeder Eintrag muB in eine Box gepackt werden. Eintrage werden tatsachlich im ver­tikalen Modus gesetzt (vertikaler und horizontaler Modus tauschen wirklich ihre Rollen!) und Zeichen, die im vertikalen Modus auftauchen, erzeugen eine Box der Breite \hsize. Hier packten wir die # der Schablonen in eine \hbox; dies reicht fUr aIle Eintrage.

• Eintrage derselben Spalte werden linksbtindig gesetzt. Das Analogon im Verhalten von \halign ist, daB dort die Eintrage einer Zeile beztiglich ihrer Grundlinie ausgerichtet werden - eine so natiirliche Konstruktion, daB wir es als selbstverstandlich ansahen. Aber hier ist die Konsequenz, daB Sie die Spalten nur dann zentrieren oder rechtsbiindig aus­richten konnen, wenn Sie ihre Breite im voraus kennen. In diesem Fall konnen Sie dann z.B.

\valign{&\hbox to . 25\hsize{\strut\hfil#}\cr ... }

eingeben. Aber wie Sie wissen, hat \hbox{\strut\hfil#} keine Wirkung, und die Spring auBerhalb der Box zu setzen ware fatal: Sie wtirde im vertikalen Modus gelesen, und dort hat eine Box die Breite \hsize.

• Weil kein Standard-Glue yom \baselineskip zwischen den Boxen einer Spalte hinzugeftigt wird, benotigt man Stiitzen, urn den Abstand zwischen Zeilen zu regeln. Wenn Sie den durch regulare Sttitzen erzeugten Leerraum als ungeniigend empfinden,

Page 22: TEX Praxis || Tabellen

162 Kapitel 9. Tabel/en

konnen Sie extra hohe Stiitzen verwenden oder \tabskip-Glue, der jetzt zwischen Zei­len eingefiigt wird:

{\tabskip=2pt \valign{&\hbox{\strut\quad#}\cr

}}

Ausgefallenere Tabellen Vertikale Linien zwischen Spalten sind leieht zu erhalten, wie horizontale Linien zwi­

schen Zeilen in einer \halign-Tabelle. Sie miissen nur \noalign{\ vrule} nach jedem \ cr einsetzen und dafiir sorgen, daB genug Platz auf beiden Seiten des # in der Schablone ist:

\valign{&\hbox{\strut\quad#\quad}\cr\noalign{\vrule} Abel&Agnes&Amanda&Andrea&Arnold\cr\noalign{\vrule} ... \noalign{\vrule}}

Abel Barbara Christoph Diana Agnes Bernhard Claudia Dominik Amanda Bertold Cornelia Andrea Brigitte Arnold

Vielleieht ziehen Sie es vor, die Linien zwischen einzelnen Eintrligen zu ziehen, so daB Sie im Falle kurzer Spalten nieht bis zum Boden der Tabelle reichen. In einer \halign­Tabelle brauchten wir fUr die LOsung des analogen Problems \omit\hrulefill. In Plain-TEX gibt es keinen \vrulefill-Befehl, aber wir k6nnen leicht Abhilfe schaffen, indem wir die Definition von \hrulefill von Seite 357 des The TEXbook umschreiben:

\def\vrulefill{\leaders\vrule\vfill}

(Analog konnen auch die anderen, auf dem \leaders-Befehl basierenden Makros um­geschrieben werden.)

Die kurzen Linien stoBen auch ohne den Gebrauch von \offinterlineskip anein­ander, weil es sowieso keinen DurchschuB zwischen den Zeilen gibt.

\valign{&\hbox{\strut\quad#\quad}\cr \multispan5\vrulefill\cr Abel&Agnes&Amanda&Andrea&Arnold\cr \multispan5\vrulefill\cr

Diana&Dominik\cr \multispan2\vrulefill\cr}

Page 23: TEX Praxis || Tabellen

9. 12 Vertikaler Tabellensatz 163

Abel Barbara Christoph Diana

I Agnes Bernhard Claudia Dominik Amanda Bertold Cornelia Andrea Brigitte Arnold

Horizontale Linien k6nnen analog eingefiigt werden. Wie in der Praambel vom Befehl \halign lassen wir Zeilen von Eintragen mit "Zeilen" von Linien abwechseln, und eine Linie er6ffnet dieses Wechselspiel. Wir erh6hen die Zahl der Et-Zeichen und der Argu­mente, um den neuen \vrulefill-"Zeilen" Rechnung zu tragen.

\def\strut{\vrule height 10.5pt depth 5.5pt width Opt} \valign{\hrule#&&\hbox{\strut\quad#\quad}&\hrule#\cr

\multispan{ll}\vrulefill\cr &Abel&&Agnes&&Amanda&&Andrea&&Arnold&\cr \multispan{ll}\vrulefill\cr

&Diana&&Dominik&\cr \multispan5\vrulefill\cr}

Abel Barbara

Agnes Bernard

Amanda Bertold

Andrea Brigitte

Arnold

Christoph Diana

Claudia Dominik

Cornelia


Recommended