Beim Setzen von Absätzen möchte ich sicherstellen, dass die letzte Zeile weder zu kurz nochnochzu lang.Zu diesem Zweck suche ich nach Einstellungen, die Folgendes bewirken:
- ein vollständig ausgerichteter, perfekt rechteckiger Absatz;
- ein Blocksatz, dessen letzte Zeile zu mehr als 20 % und weniger als 80 % ausgefüllt ist.
Mit anderen Worten: Kein Absatz sollte eine letzte Zeile haben, die weniger als 20 % oder mehr als 80 % ausgefüllt ist – stattdessen sollten sie im Blocksatz stehen. Der Effekt könnte durch manuelles Hinzufügen \parfillskip 0pt
(nur) zu diesen Absätzen erreicht werden, aber genau das möchte ich stattdessen automatisieren.
Dieses Dokument zeigt zwei gute und zwei schlechte Beispiele:
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
% Page setup
\usepackage[a4paper,margin=3cm]{geometry}
% Typography
\usepackage{newtxtext,newtxmath}
\usepackage{microtype}
\parindent 0pt
\parskip\baselineskip
\begin{document}
\textbf{I'm looking for settings
that produce either a)~a~perfect rectangle
or b)~a paragraph whose last line
is filled more than 20\% and less than 80\%.}
\section*{Good examples}
\textbf{My perfect paragraph is a~rectangle:}
{
\parfillskip 0pt
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed rhoncus lorem eget ultricies bibendum. Duis luctus felis arcu, sit amet dapibus orci imperdiet id. Duis ullamcorper tortor eget leo fringilla, a lacinia nisl pulvinar. Etiam id facilisis augue. Sed convallis tempus ex, sed accumsan justo pulvinar vitae. Sed id sapien leo. Aliquam posuere ex lacus, ut posuere metus ullamcorper eu. Duis a imperdiet nibh. Donec tincidunt hendrerit nulla, et convallis metus imperdiet nec. Pellentesque massa enim, pharetra in pulvinar a, efficitur nec lorem. Cras mattis ex lorem, et euismod ligula rhoncus. Aenean ultricies quis velit non faucibus.
}
\textbf{However, this is not always achievable (and that's fine):}
{
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed rhoncus lorem eget ultricies bibendum. Duis luctus felis arcu, sit amet dapibus orci imperdiet id. Duis ullamcorper tortor eget leo fringilla, a lacinia nisl pulvinar. Etiam id facilisis augue. Sed convallis tempus ex, sed accumsan justo pulvinar vitae. Sed id sapien leo. Aliquam posuere ex lacus, ut posuere metus ullamcorper eu. Duis a imperdiet nibh. Donec tincidunt hendrerit nulla, et convallis metus imperdiet nec. Pellentesque massa enim, pharetra in pulvinar a, efficitur nec lorem. Cras mattis ex lorem, et euismod ligula rhoncus.
}
\section*{Bad examples}
\textbf{This last line is too short:}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed rhoncus lorem eget ultricies bibendum. Duis luctus felis arcu, sit amet dapibus orci imperdiet id. Duis ullamcorper tortor eget leo fringilla, a lacinia nisl pulvinar. Etiam id facilisis augue. Sed convallis tempus ex, sed accumsan justo pulvinar vitae. Sed id sapien leo. Aliquam posuere ex lacus, ut posuere metus ullamcorper eu. Duis a imperdiet nibh. Donec tincidunt hendrerit nulla, et convallis metus imperdiet nec. Pellentesque massa enim, pharetra in pulvinar a, efficitur nec lorem.
\textbf{The above can be fixed with}
\verb!\parfillskip 0pt plus 0.80\textwidth!
\textbf{but that doesn't help for the case below.}
\textbf{This last line should have been justified (note the small gap at the end):}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed rhoncus lorem eget ultricies bibendum. Duis luctus felis arcu, sit amet dapibus orci imperdiet id. Duis ullamcorper tortor eget leo fringilla, a lacinia nisl pulvinar. Etiam id facilisis augue. Sed convallis tempus ex, sed accumsan justo pulvinar vitae. Sed id sapien leo. Aliquam posuere ex lacus, ut posuere metus ullamcorper eu. Duis a imperdiet nibh. Donec tincidunt hendrerit nulla, et convallis metus imperdiet nec. Pellentesque massa enim, pharetra in pulvinar a, efficitur nec lorem. Cras mattis ex lorem, et euismod ligula rhoncus. Aenean ultricies quis velit non ut faucibus.
\textbf{The above can be fixed with}
\verb!\parfillskip 0pt!
\textbf{but that doesn't help for the case below.}
\end{document}
Eine Lösung sollte bestehen ausAnpassungen nur in der Präambel. Am Anfang oder Ende eines Absatzes sollten keine speziellen Befehle erforderlich sein. Ich hoffe, dass es, wie in mehreren ähnlichen Fällen, mit einem speziellen Stück Klebstoff in gelöst werden kann \parfillskip
, aber ich bin nicht sicher, ob das möglich ist.
Verwandte Fragen, deren Lösungen ich ausprobiert habe, die aber nicht das gewünschte Ergebnis liefern:
- Vermeiden Sie nur fast ausgefüllte letzte Zeilenlöstlangletzte Zeilen, aber nichtkurzEinsen.
- Mindestlänge der letzten Zeile eines Absatzeslöstkurzletzte Zeilen, aber nichtlangEinsen.
- Gibt es ein Tool, das Absätze in Rechtecke umwandelt?bevorzugt zu stark Rechtecke, selbst wenn die letzte Zeile nur zur Hälfte ausgefüllt ist, was zu übermäßigen Abständen zwischen den Wörtern führt.
Antwort1
Dieser Ansatz isthalb-automatisch, indem man den Absatz noch in ein \fixit
Makro einschließen muss.
ÜBERARBEITETER ANSATZ
Anstatt den Absatz Wort für Wort zu zerlegen, wie im URSPRÜNGLICHEN VORGEHEN unten, messe ich hier einfach die Länge des \hbox
Absatzes, der den Absatzinhalt enthält, und entscheide auf Grundlage der Länge, ob ein abschließender \hspace{}\mbox
und/oder ein verwendet werden soll \parfillskip0pt
.
Das Makro bietet ein optionales Argument, falls eine Anpassung erforderlich ist. Es stellt den größten Bruchteil der Zeilenüberschreitung dar, der komprimiert wird. Derzeit ist es auf .05
(5 %) eingestellt. Sie wissen, dass eine Anpassung erforderlich ist, wenn eine Zeile, von der Sie dachten, sie würde komprimiert, in eine ganz neue Zeile mit weitem Abstand erweitert wird. Wenn Sie den Standardwert auf festlegen, .0
werden alle Probleme behoben, allerdings auf Kosten einiger Zeilen, die andernfalls komprimiert werden könnten, um nachfolgende Hurenstube-Zeichen zu eliminieren, stattdessen erweitert, sodass die Hurenstube 20 % der nachfolgenden Zeile einnimmt.
\documentclass{article}
\usepackage[margin=1.5in,top=0cm,bottom=0cm]{geometry}
\newcommand\fixit[2][.05]{%
\setbox0=\hbox{\hspace{\parindent}#2}\fixithelp{#1}{#2}}
\newcommand\fixithelp[2]{%
\wd0=\dimexpr\wd0-\linewidth\relax%
\ifdim\wd0>0pt\relax%
\fixithelp{#1}{#2}%
\else%
\wd0=\dimexpr\wd0+\linewidth\relax
\ifdim\wd0>.9\linewidth\relax%
{\parfillskip0pt\relax#2\par}%
\else%
\ifdim\wd0>.8\linewidth\relax%
{\parfillskip0pt\relax#2\hspace{.2\linewidth}\par}%
\else%
\ifdim\wd0<#1\linewidth\relax%
{\parfillskip0pt\relax#2\par}%
\else%
\ifdim\wd0<.2\linewidth\relax%
{\parfillskip0pt\relax#2\hspace{.8\linewidth}\mbox{}\par}%
\else%
#2%
\fi
\fi
\fi
\fi
\fi%
}
\sloppy
\parskip1ex
\begin{document}
\noindent\rule{.2\linewidth}{2pt}\hfill\rule{.2\linewidth}{2pt}
\fixit{%
yakity yack, paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
yack, yakity yack, paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
yakity yack, yakity yack, paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
yack, yakity yack, yakity yack, paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
yackity yack, yakity yack, yakity yack, paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
yack, yackity yack, yakity yack, yakity yack, paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
yackity yack, yackity yack, yakity yack, yakity yack, paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
yack, yackity yack, yackity yack, yakity yack, yakity yack, paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
yackity yack, yackity yack, yackity yack, yakity yack, yakity yack, paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
yack, yackity yack, yackity yack, yackity yack, yakity yack, yakity yack, paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
yackity yack, yackity yack, yackity yack, yackity yack, yakity yack, yakity yack, paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
yack, yackity yack, yackity yack, yackity yack, yackity yack, yakity yack, yakity yack, paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
yackity yack, yackity yack, yackity yack, yackity yack, yackity yack, yakity yack, yakity yack, paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
yack, yackity yack, yackity yack, yackity yack, yackity yack, yackity yack, yakity yack, yakity yack, paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
yackity yack, yackity yack, yackity yack, yackity yack, yackity yack, yackity yack, yakity yack, yakity yack, paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
yack, yackity yack, yackity yack, yackity yack, yackity yack, yackity yack, yackity yack, yakity yack, yakity yack, paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
yackity yack, yackity yack, yackity yack, yackity yack, yackity yack, yackity yack, yackity yack, yakity yack, yakity yack, paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\end{document}
Ränder = 1,5 Zoll
Ränder = 1,7 Zoll
Ränder = 1,9 Zoll
ORIGINALER ANSATZ
Das Makro wiederholt den Absatz Wort für Wort, bis nur noch die letzten 4 Wörter übrig sind. Dann ermittelt es, wie viele dieser letzten Wörter erforderlich sind, um zu überschreiten, .2\linewidth
und bündelt sie in einem \mbox
zusammen mit einem \hspace{.2\linewidth}
. Wenn die letzten 3 Wörter nicht überschreiten .2\linewidth
, verwendet es alle 4 im \mbox
.
Denn was der OP verlangt, \sloppy
wird mit ziemlicher Sicherheit erforderlich sein, da wir davon sprechen, die Textlänge auf .4\linewidth
einen Schlag zu ändern (was fast immer unerwünscht ist). Also habe ich es hinzugefügt.
Dieser Ansatz funktioniert nicht, wenn eine zuvor geöffnete Gruppe innerhalb der letzten 4 Wörter des Absatzes beendet wird. Dies trifft beispielsweise zu, wenn eine lange Gruppe \textit
am Ende eines Absatzes geschlossen wird.
Außerdem ist zu beachten, dass ein perfekt rechteckiger Absatzniemalsmit diesem Ansatz erstellt werden, aufgrund der \hspace
am Ende des Absatzes hinzugefügten.
\documentclass{article}
\newcommand\fixit[1]{\fixithelp#1 \cr\relax}
\def\fixithelp#1 #2 #3 #4 #5\relax{\ifx \cr#5\finishup#1 #2 #3 #4\relax%
\else#1 \fixithelp#2 #3 #4 #5\relax\fi}
\def\finishup#1 #2 #3 #4\relax{ %
\setbox0=\hbox{#4}%
\ifdim\wd0>.2\linewidth\relax #1 #2 #3 \mbox{#4\hspace{.2\linewidth}}\else%
\setbox0=\hbox{#3 #4}%
\ifdim\wd0>.2\linewidth\relax #1 #2 \mbox{#3 #4\hspace{.2\linewidth}}\else%
\setbox0=\hbox{#2 #3 #4}%
\ifdim\wd0>.2\linewidth\relax #1 \mbox{#2 #3 #4\hspace{.2\linewidth}}\else%
\mbox{#1 #2 #3 #4\hspace{.2\linewidth}}%
\fi%
\fi%
\fi%
}
\sloppy
\parskip1em
\begin{document}
\fixit{typesetting
paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce either:}
\fixit{%
paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce overlylongwords:}
\fixit{%
I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce overlylongwords:}
\fixit{%
typesetting paragraphs, I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce I I I I:}
\fixit{%
typesetting I want to \textit{ensure their last line} is neither
overly short nor overly long. To that end, I'm looking for settings that
produce I I I I:}
\end{document}