Anomalien und eine Frage zu einer Zeilenfüllregel

Anomalien und eine Frage zu einer Zeilenfüllregel

Ich habe einen Befehl zum Füllen einer Linie mit einem schwarzen Rechteck erstellt. Er heißt und \fullruleist 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:

Vollregel

  1. Warum ist die erste Zeile meines Dokuments eingerückt? (Okay, das ist das kleinste Problem.)
  2. Ich musste \hspace*{0pt}direkt vor \leadersund nach dem „ganzen \leadersTeil“ 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.)
  3. Gibt es eine Möglichkeit, den \fullruleBefehl so umzuschreiben, dass die tatsächliche Schriftgröße anstelle von 10 pt verwendet wird (siehe % MARK 1im obigen Code) und die Erhöhung der Regel anhand der tatsächlichen Schriftgröße berechnet wird (siehe % MARK 2im 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, \fullrulebeginnt Ihr Text einen Absatz und ist daher eingerückt.

Sehen wir uns an, was die neue Definition bewirkt:

  1. \noindentbeginnt einen Absatz ohne Einrückung; wenn wir uns bereits in einem Absatz befinden, passiert nichts.

  2. \nulllässt eine unsichtbare Box fallen, die dafür sorgt, dass \fullrulesie am Anfang einer Zeile nicht verschluckt wird.

  3. Anstatt eine Box zu wiederholen, nutzen wir die \leaders\hruleFunktion von TeX: Füllen Sie den am Ende angegebenen Raum (in diesem Fall \hfill) mit einer Regel.

  4. \nullverhindert, dass die Füllzeichen am Ende eines Absatzes ignoriert werden (dies tut TeX immer, \unskipwenn 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 \hruleSpezifikation 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

\leadersim vertikalen Modus ist vertikaler Kleber zu erwarten. Daher kann \leaderswith \hfillim 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, \leavemodesondern auch mit \hspace*oder einem anderen unsichtbaren Element wie \null(im LaTeX-Kernel als leere horizontale Box definiert: \hbox{}).

\hfillam 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 \hspaceohne Stern) oder \kern0pt(das wurde im LaTeX-Kernel in ähnlichen Fällen gemacht) verwendet, z. B. \dotfilloder \hrulefill.

Um die Höhe und Tiefe einer Linie zu ermitteln, können Sie \ht\strutboxund verwenden \dp\strutbox.

Hier ein Vorschlag mit einer angepassten Version des \hrulefillLaTeX-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.

verwandte Informationen