
Ich habe einen Befehl zum Füllen einer Linie mit einem schwarzen Rechteck erstellt. Er heißt und \fullrule
ist im Code unten zu finden.
Ich habe mehrere Fragen zu diesem MWE:
\documentclass[10pt]{article}
\usepackage[a4paper]{geometry}
\newlength{\mylift}
\setlength{\mylift}{-10pt} % MARK2
\addtolength{\mylift}{-1ex}
\addtolength{\mylift}{\baselineskip}
\newcommand{\fullrule}{%
{\hspace*{0pt}\leaders\hbox{\rule[\mylift]{1pt}{10pt}}\hfill}% % MARK 1
\hspace*{0pt}}
\begin{document}
aaa
\fullrule
aaa\fullrule{}\\
\fullrule{}\\
\fullrule{}
\fullrule
aaa\fullrule{}aaa
\fullrule{}\\
\fullrule{}aaa\\
\fullrule
\end{document}
Dies ist das Ergebnis:
- Warum ist die erste Zeile meines Dokuments eingerückt? (Okay, das ist das kleinste Problem.)
- Ich musste
\hspace*{0pt}
direkt vor\leaders
und nach dem „ganzen\leaders
Teil“ hinzufügen, damit es mit Zeilen ohne führende Zeichen vor funktioniert\fullrule
. Warum? (Ich würde das gerne verstehen, weil es lange gedauert hat, es durch Ausprobieren herauszufinden.) - Gibt es eine Möglichkeit, den
\fullrule
Befehl so umzuschreiben, dass die tatsächliche Schriftgröße anstelle von 10 pt verwendet wird (siehe% MARK 1
im obigen Code) und die Erhöhung der Regel anhand der tatsächlichen Schriftgröße berechnet wird (siehe% MARK 2
im obigen Code)?
Danke!
Antwort1
\newcommand{\fullrule}{%
\noindent\null\leaders\hrule height \dimexpr\ht\strutbox-\fboxrule\relax
depth \dimexpr\dp\strutbox-\fboxrule\relax\hfill
\null}
Wie Lockstep bemerkt, \fullrule
beginnt Ihr Text einen Absatz und ist daher eingerückt.
Sehen wir uns an, was die neue Definition bewirkt:
\noindent
beginnt einen Absatz ohne Einrückung; wenn wir uns bereits in einem Absatz befinden, passiert nichts.\null
lässt eine unsichtbare Box fallen, die dafür sorgt, dass\fullrule
sie am Anfang einer Zeile nicht verschluckt wird.Anstatt eine Box zu wiederholen, nutzen wir die
\leaders\hrule
Funktion von TeX: Füllen Sie den am Ende angegebenen Raum (in diesem Fall\hfill
) mit einer Regel.\null
verhindert, dass die Füllzeichen am Ende eines Absatzes ignoriert werden (dies tut TeX immer,\unskip
wenn es das Ende eines Absatzes scannt).
Für die Punkte 2 und 4 ist es wichtig zu wissen, dass Füllzeichen wie Klebstoffe behandelt werden, abgesehen davon, dass der Raum mit etwas aufgefüllt wird, anstatt mit Leerraum.
Die \hrule
Spezifikation teilt TeX mit, dass die Regel so hoch und tief wie eine Strebe sein soll (mit einer kleinen Korrektur, die Sie selbst anpassen können); daher hängen Höhe und Tiefe der Regel vom aktuellen Baselineskip ab.
Antwort2
\leaders
im vertikalen Modus ist vertikaler Kleber zu erwarten. Daher kann \leaders
with \hfill
im vertikalen Modus nicht verwendet werden. Am Anfang eines neuen Absatzes befinden Sie sich im vertikalen Modus. Sie müssen den vertikalen Modus also zuerst verlassen. Sie können dies nicht nur mit tun, \leavemode
sondern auch mit \hspace*
oder einem anderen unsichtbaren Element wie \null
(im LaTeX-Kernel als leere horizontale Box definiert: \hbox{}
).
\hfill
am Ende einer Zeile füllt nichts, da TeX den letzten horizontalen Abstand am Ende von Absätzen entfernt. Dies kann man vermeiden, indem man entweder wieder unsichtbares Material oder einen weiteren horizontalen Abstand (auch \hspace
ohne Stern) oder \kern0pt
(das wurde im LaTeX-Kernel in ähnlichen Fällen gemacht) verwendet, z. B. \dotfill
oder \hrulefill
.
Um die Höhe und Tiefe einer Linie zu ermitteln, können Sie \ht\strutbox
und verwenden \dp\strutbox
.
Hier ein Vorschlag mit einer angepassten Version des \hrulefill
LaTeX-Kernels (nur Höhe und Tiefe der Regel wurden hinzugefügt):
\newcommand{\fullrule}{%
\leavevmode
\leaders\hrule height\ht\strutbox depth\dp\strutbox\hfill\kern0pt}%
Diese Version entfernt den Absatzeinzug nicht. Wenn Sie den Absatzeinzug entfernen möchten, verwenden Sie die Lösung von egreg.