Ist es möglich, eine gepunktete Version von „\vrule“ zu definieren?

Ist es möglich, eine gepunktete Version von „\vrule“ zu definieren?

Das \vrulePrimitiv 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}

Bildbeschreibung hier eingeben

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\cleaderswird über und eine infinite Verbindungsspezifikation ( ) definiert \hfill. Eine ähnliche Definition von \vdotfillhat zwei Probleme:

  • \leadersund 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-saveposproject zrefstellt 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 \vadjustdie Positionsmessung stört.

Lösungsskizze mit LuaTeX

LuaTeX bietet eine neue Funktion „Attribut“. So \vrulekann 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 \vruledie 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 \vdotfilWert größer als 5 cm hoch und 2 cm tief. Das zweite Beispiel entspricht \hbox{Hello\vrule you}.

Das \valignist 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 \putboxfü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.

verwandte Informationen