Ich stoße immer wieder auf den Befehl \strut und würde gern wissen, was der eigentlich genau macht.

gefragt 17 Aug '13, 00:05

welle's gravatar image

welle
106222631
Akzeptiert-Rate: 0%

bearbeitet 17 Aug '13, 00:08


Definiert ist \strut im LaTeX-Kernel, der Datei latex.ltx, folgendermaßen:

\newbox\strutbox
\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}

Das Makro \set@fontsize, das z.B. von \selectfont aufgerufen wird, enthält folgende Anweisung:

 \setbox\strutbox\hbox{%
  \vrule\@height.7\baselineskip
        \@depth.3\baselineskip
        \@width\z@}%

Das bedeutet, \strut ist eine Box (man erinnere sich: alles, was TeX setzt, auch jeder Buchstabe, sind in TeXs Augen Boxen), die eine vertikale Linie mit der Breite 0 aber mit einer Höhe von 70% der aktuellen \baselineskip, also dem Abstand einer Grundlinie zur nächsten, und mit einer Tiefe von 30% der aktuellen \baselineskip enthält.

Verwendet wird \strut oder die \strutbox z.B. intern in Tabellenzeilen einer tabular, um zu gewährleisten, dass eine Zeile auch dann die richtige Höhe und Tiefe hat, wenn sie z.B. nur Buchstaben ohne Unter- und Oberlänge enthält, also Kleinbuchstaben wie a, c, e, m, n usw.

Das plain TeX Format enthält übrigens eine ganz ähnliche Definition (in plain.tex):

\newbox\strutbox
\setbox\strutbox=\hbox{\vrule height8.5pt depth3.5pt width\z@}
\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
Permanenter link

beantwortet 17 Aug '13, 00:33

cgnieder's gravatar image

cgnieder
22.1k243463
Akzeptiert-Rate: 60%

bearbeitet 17 Aug '13, 00:46

Zusätzlich zur Antwort von Clemens über die Definition und Verwendung der Anweisung \strut ist vielleicht anzumerken, dass es auch den Befehl \mathstrut gibt. Wie der Name dieses Befehls andeutet, ähnelt er der Anweisung \strut sollte aber v.a. im Mathematik-Satz angewendet werden.

\mathstrut ist definiert in LaTeX und auch Plain-TeX als {\vphantom(}. D.h., es ist eine Box mit der Höhe und Tiefe einer runden Klammer, ), und mit Null Breite -- und ist somit unsichtbar (ein "Phantom", so zu sagen...). Die Gesamt-Höhe (height + depth) einer runden Klammer ist in \textstyle normalerweise gleich der nominalen Größe der Schrift, z.B., 10pt. (In \scriptstyle und \scriptscriptstyle Situationen verringert sich diese Größe automatisch auf 7pt bzw. 5pt.) Somit ist die Gesamt-Höhe von \mathstrut leicht geringer als die von \strut -- welche gleich \baselineskip ist, also ca. 12pt in einem single-spaced Dokument falls die Schrift eine Nominal-Größe von 10pt hat.

Eine gute Anwendung von \mathstrut ergibt sich etwa beim Setzen von Wurzel-Zeichen. TeX bemüht sich normalerweise sehr, die Tiefe und Höhe eines Wurzel-Zeichens dem "Inhalt" anzupassen, d.h., die Tiefe und Höhe des Zeichens sind verschieden je nachdem ob der Inhalt ein y, ein a, oder ein k ist. Dies ist normalerweise sehr wünschenswert, kreiert aber vielleicht etwas leicht Unschönes wenn mehrere Wurzel-Zeichen mit unterschiedlichen Höhen und Tiefen nahe beieinander vorkommen. Hier kann das Einsetzen von \mathstrut Anweisungen behiflich sein, wie das folgende Beispiel illustriert. Die erste Zeile zeigt den Output von \sqrt{y}, \sqrt{a}, und \sqrt{k}: die Tiefen und Höhen der drei Wurzel-Zeichen sind alle verschieden, was störend wirken magt. Die zweite Zeile zeigt das Resultat des Einsatzes von \mathstrut Befehlen -- alle drei Wurzel-Zeichen sind nun gleich gross. Die dritte Zeile zeigt was passiert falls man (inkorrekterweise) \strut anstatt \mathstrut zum Einsatz bringen würde: die Wurzel-Zeichen wären absurd gross!

alt text

\documentclass{article}
\usepackage[utf8]{inputenc}
\begin{document}  
$\sqrt{y}\sqrt{a}\sqrt{k}$ 
\ \,--- nicht ganz schön\dots

$\sqrt{\mathstrut y} \sqrt{\mathstrut a} \sqrt{\mathstrut k}$ 
--- mit \texttt{\textbackslash mathstrut}: gut!

$\sqrt{\strut y} \sqrt{\strut a} \sqrt{\strut k}$ 
--- mit \texttt{\textbackslash strut}: zu viel des Guten!
\end{document}

Moral der Geschicht´: Im Text-Satz sollte man \strut verwenden, im Mathematik-Satz aber \mathstrut.

Permanenter link

beantwortet 18 Aug '13, 08:12

Mico's gravatar image

Mico
28513
Akzeptiert-Rate: 10%

bearbeitet 18 Aug '13, 10:16

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×52

gestellte Frage: 17 Aug '13, 00:05

Frage wurde gesehen: 29,587 Mal

zuletzt geändert: 18 Aug '13, 10:16