Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

\strutbox: optische vertikale Zentrierung der Schrift.

198 views
Skip to first unread message

Karl-Heinz Krause

unread,
Dec 1, 1998, 3:00:00 AM12/1/98
to

1. Problembeschreibung
----------------------

Wenn man in LaTeX Linien zwischen die Zeilen macht, etwa bei Tabellen,
dann scheinen die Buchstaben an der oberen Linie zu kleben. Der Abstand
nach oben sieht deutlich kleiner aus als der nach unten. Schaut man
genau hin, dann sieht man aber, daß das eigentlich gar nicht stimmt.
Tatsächlich ist die Anordnung der Zeichen so, daß der Abstand der
Großbuchstaben zur oberen etwa so groß ist wie der der Unterlängen zur
unteren Trennlinie. Und genau daran liegt es: Unterlängen kommen nämlich
eher selten vor und spielen für den optischen Eindruck der Zeilenhöhe
keine Rolle. Anders gesagt: Will man die Schrift optisch innerhalb der
Zeile (vertikal) zentrieren, dann muß man sie etwas hinunterschieben und
dabei inkaufnehmen, daß die Unterlängen näher an die untere Zeilengrenze
heranrücken.

Bei LaTeX ist für die genaue vertikale Ausrichtung einer Zeile die
\strutbox verantwortlich. Das ist eine kleine vertikale Linie der Breite
null (also unsichtbar) und einer Gesamthöhe, die gleich dem
Zeilenabstand ist. Die \strutbox bestimmt aber nicht nur die Gesamthöhe
der Zeile, sondern auch ihre Aufteilung in Ober- und Unterlänge, und
somit die Lage der Grundlinie innerhalb der Zeile. LaTeX benutzt eine
Aufteilung von 0,7 : 0,3; d.h. die Höhe der Strutbox ist
0.7\baselineskip und ihre Tiefe ist 0.3\baselineskip. Diese Aufteilung
ist ungünstig, denn sie führt zu dem o.g. Eindruck der am oberen
Zeilenrand klebenden Buschstaben. (Normalerweise sieht man das natürlich
nicht, sondern nur dann, wenn man Lienien zwischen die Zeilen macht oder
einzelne Zeilen oder Wörter mit Farbe hinterlegt.) Eine Aufteilung im
Verhältnis 0,75 : 0,25 ist m.E. wesentlich besser. Die Unterlängen
berühren dann zwar schon fast den unteren Zeilenrand, was aber den
optischen Gesamteindruck nicht stört. Im Ganzen erscheint die Schrift
wesentlich besser (vertikal) zentriert.

Mich interessiert jetzt Eure Meinung: Haltet Ihr es für eine gute Idee,
die Definition der \strutbox zu ändern, oder spricht irgendwas dagegen?
Die \strutbox, die ja Fontgrößenabhängig ist, wird im Makro
\set@fontsize gesetzt, dieses Makro müßte man also modifizieren. Ich
habe das natürlich nicht in der original LaTeX-Quelle gemacht, sondern
ein Stylefile "strutbox.sty" geschrieben, wo die neue Definition
drinsteht.


2. Vergrößerter Zeilenabstand
-----------------------------

Die Originaldefinition der Strutbox ist, wie oben schon erwähnt,

\vrule\@height.7\baselineskip
\@depth.3\baselineskip
\@width\z@

Es reicht nun nicht, diese Definition zu ändern in

\vrule\@height.75\baselineskip
\@depth.25\baselineskip
\@width\z@

Diese Definition liefert zwar ein gutes Ergebnis, wenn der normale
Zeilenabstand benutzt wird, nicht jedoch, wenn dieser mittels
\baselinestretch oder \linespread vergrößert wird. Bei obiger Definition
würde dann nämlich einfach die Höhe und Tiefe der Zeile proportional
vergrößert und als Folge davon wäre der zusätzliche Durchschuß am oberen
Zeilenrand größer als am unteren. Die Schrift würde bei vergrößertem
Zeilenabstand also nach unten verschoben. Für eine optische Zentrierung
der Schrift ist es aber erforderlich, daß der zusätzliche Durchschuß
gleichmäßig auf den oberen und den unteren Zeilenrand aufgeteilt wird.
Daher habe ich folgende Definiton der Strutbox benutzt:

\@tempdima\baselineskip
\@tempdimb 1.5ex
\advance\@tempdima -\@tempdimb
\advance\@tempdimb 0.5\@tempdima
\vrule
\@height \@tempdimb
\@depth 0.5\@tempdima
\@width\z@

Auch hierzu ist Eure Meinung gefragt: Ist das gut, schlecht, sinnvoll
doer sinnlos? Wie hättet Ihr das gemacht?


3. Tabellen
-----------

Innerhalb von tabular- und array-Umgebungen wird nicht \strutbox
benutzt, sondern \@arstrutbox. Diese unterscheidet sich dadurch, daß
ihre Gesamthöhe um den Faktor \arraystretch vergrößert wurde. (Falls das
array-Paket geladen ist, wird außerdem noch \extrarowheight
berücksichtigt.) Hier gilt nun dasselbe, was ich schon oben gesagt habe:
In der Originaldefinition der \@arstrutbox wird einfach die \strutbox
proportional vergrößert, was zur Folge hat, daß sich der zusätzliche
Durchschuß ungleichmäßig auf den oberen und unteren Zeilenrand verteilt.
Daher ist es auch erforderlich, die Definition der \@arstrutbox
anzupassen. Ich habe folgende gewählt:

\@tempdima \ht\strutbox
\@tempdimb \dp\strutbox
\advance \@tempdima \extrarowheight
\advance\@tempdimb \arraystretch\@tempdimb
\advance\@tempdimb \arraystretch\@tempdima
\advance\@tempdimb -\@tempdima
\advance\@tempdima \arraystretch\@tempdima
\advance\@tempdima \arraystretch\dp\strutbox
\advance\@tempdima -\dp\strutbox
\setbox \@arstrutbox \hbox{\vrule
\@height 0.5\@tempdima
\@depth 0.5\@tempdimb
\@width \z@}


Das sieht ziemlich kompliziert aus, es geht aber meiner Meinung nach
nicht einfach, wenn man den zusätzlichen Durchschuß von \arraystretch
gleichmäßig nach oben und unten verteilen will.

Auch hir ist natürlich Eure Meinung gefragt!

Wer sich für mein strutbox.sty interessiert, der kann mich anmailen, auf
daß ich es ihm schicke. Über eine Rückmeldung in Form von Kommentaren,
Kritik und Verbesserungsvorschlägen würde ich mich natürlich freuen.


Karl-Heinz Krause

Axel Reichert

unread,
Dec 2, 1998, 3:00:00 AM12/2/98
to
khkr...@gmx.de (Karl-Heinz Krause) writes:

> Wenn man in LaTeX Linien zwischen die Zeilen macht, etwa bei Tabellen,
> dann scheinen die Buchstaben an der oberen Linie zu kleben.

Du kennst booktabs.sty?

Tschoe!

--
Axel Reichert -- http://mt.mpie-duesseldorf.mpg.de/people/reich/

0 new messages