
Das \vrule
Primitiv hat eine nette Eigenschaft: Es hat die Fähigkeit, sich an die Höhe und Tiefe der umschließenden Box anzupassen:
\documentclass{article}
\newcommand\TestBox{\parbox[c][3cm][c]{1em}{\centering A}}
\begin{document}
\noindent
\TestBox\vrule\TestBox
\noindent
\rule{10pt}{1cm}\,\vrule\,\rule[3cm]{10pt}{1cm}
\end{document}
Ist es möglich, einen ähnlichen Befehl zu definieren, beispielsweise \vdotfill
, der ein gepunktetes Äquivalent von ist \vrule
? Wenn ja, wie? Und wenn nicht, warum nicht?
Antwort1
\dotfill
\cleaders
wird über und eine infinite Verbindungsspezifikation ( ) definiert \hfill
. Eine ähnliche Definition von \vdotfill
hat zwei Probleme:
\leaders
und Freunde funktionieren nur mit horizontalem Kleber im horizontalen Modus oder vertikalem Kleber im vertikalen Modus. Orthogonale Varianten sind nicht verfügbar.Es gibt zwei vertikale Richtungen (Höhe und Tiefe) statt einer horizontalen. Das wirft viele neue Fragen auf: Wo beginnt die Füllung? Wie werden Richtung(en) und Menge(en) angegeben?
PDF-Operatoren
Wird die TeX-Regel durch eine Linie in der PDF-Seitenbeschreibung umgesetzt, dann ließe sich der Grafikzustand so ändern, dass eine gestrichelte Linie entsteht, ggf. mit abgerundeten Linienenden. Eine Regel lässt sich aber auch durch ein gefülltes Rechteck umsetzen, wo dieser Trick nicht funktioniert.
Umständlicher Workaround für pdfTeX
Die vertikalen Positionen können in pdfTeX über \pdfsavepos
(das Modul zref-savepos
project zref
stellt eine Schnittstelle dazu bereit) an der Basislinie sowie über \vadjust
(nach) und \vadjust pre
(vor) der aktuellen Linie eingefügt werden. Letzteres ist eine Besonderheit von pdfTeX. Dabei können Tiefe und Höhe berechnet und die vertikale gepunktete Linie gesetzt werden.
Dies funktioniert jedoch nicht in allen Fällen. Beispielsweise kann anderes Material hinzugefügt werden, das \vadjust
die Positionsmessung stört.
Lösungsskizze mit LuaTeX
LuaTeX bietet eine neue Funktion „Attribut“. So \vrule
kann eine Normale mit der richtigen Breite mit einem Attribut festgelegt werden, das eine vertikale gepunktete Linie bedeutet. Anschließend wird die erstellte Seite (ihr Knotenbaum) durchsucht, um solche Regeln zu finden und sie durch gepunktete vertikale Linien zu ersetzen.
Antwort2
Nur \vrule
die Höhe und Tiefe können an die Abmessungen der äußeren Box angepasst werden. Wenn Sie eine gepunktete V-Regel zwischen zwei oder mehr Boxen mit unbekannter Höhe und Tiefe einfügen müssen, können Sie Folgendes verwenden \valign
:
\def\putbox{\afterassignment\putboxA\setbox0=}
\def\putboxA{\aftergroup\putboxB}
\def\putboxB{\global\dimen0=\dp0 \dp0=0pt \box0 & \kern\dimen0 \cr}
\def\puttext#1{\putbox\hbox{#1}}
\def\vdotfil{\omit\span\omit
\kern-.1pt\xleaders\vbox{\kern.1pt\hbox{.}\kern.1pt}\vfil\kern-.1pt\cr}
\valign{\vfil#&#\vfil\cr
\putbox\vbox{\kern 5cm \hbox{A}} % more than 5 cm height, 0pt depth
\vdotfil
\putbox\vbox{\hbox{B\vrule depth2cm width0pt}} % B height, 2 cm depth
}
\valign{\vfil#&#\vfil\cr
\puttext {Hello}\vdotfil \puttext {you}
}
\end
In diesem Beispiel ist der \vdotfil
Wert größer als 5 cm hoch und 2 cm tief. Das zweite Beispiel entspricht \hbox{Hello\vrule you}
.
Das \valign
ist hier mit zwei „Linien“ gestaltet, die erste „Linie“ umfasst nur die Höhen der Boxen und die zweite „Linie“ nur die Tiefen derselben Boxen. Das Makro \putbox
führt die Trennung der folgenden Box in ihren „Höhenteil“ und „Tiefenteil“ durch und fügt die Ergebnisse in die entsprechenden „Linien“ ein. Der Grund für diese Komplikation ist, dass wir die Boxen von links nach rechts mit dem Aspekt ihrer Grundlinie wie im normalen horizontalen Modus anordnen müssen.