Ensure minimal length of last line
At the end of each paragraph, TeX usually adds infinitely stretchable glue, since the usual setting of \parfillskip
is equivalent to
\setlength{\parfillskip}{0pt plus 1fill}
One way might be to set
\setlength{\parfillskip}{0pt plus\dimexpr\textwidth-2\parindent}
but this would work only for normal paragraphs. In lists one should reset the \parfillskip
with \linewidth
instead of \textwidth
: its value stated as before is not dynamically computed, but rather it's fixed. If \parfillskip
had been a macro, instead of a skip parameter (or if Knuth had provided an \everyendofpar
token parameter), things would be different. One might redefine \par
, of course, but LaTeX already does it in some cases.
Note that glue can always stretch more than the stated value, but in this case the badness of the line would increase, usually producing an Underfull \hbox
message. In general I'm inclined not to be overly confident in automatic adjustments like this: no automated system will be able to do this as well as you, writes Knuth about page breaking, but paragraph breaking is very much alike, particularly with respect to the final line.
You asked for a LuaTeX solution and you get one:
\documentclass{article}
\usepackage{luatexbase,luacode}
\begin{luacode}
local PENALTY=node.id("penalty")
last_line_twice_parindent = function (head)
while head do
local _w,_h,_d = node.dimensions(head)
if head.id == PENALTY and head.subtype ~= 15 and (_w < 2 * tex.parindent) then
-- we are at a glue and have less than 2*\parindent to go
local p = node.new("penalty")
p.penalty = 10000
p.next = head
head.prev.next = p
p.prev = head.prev
head.prev = p
end
head = head.next
end
return true
end
luatexbase.add_to_callback("pre_linebreak_filter",last_line_twice_parindent,"Raphink")
\end{luacode}
\begin{document}
\parindent = 2cm
\emergencystretch = \hsize
A wonderful serenity has taken possession of my entire soul, like these sweet mornings of spring which I enjoy with my whole heart. I am alone, and feel.
The charm of existence in this spot, which was created for the bliss of souls like mine.
I am so happy, my dear friend, so absorbed in the exquisite sense of mere tranquil existence, that I neglect my talents. I should be
incapable of drawing a single stroke at the present moment; and yet I feel that I never was a greater artist than now.
\end{document}
What it does is it adds ties (~
) between the words at the end of a paragraph, when the distance to the end is less then 2*\parindent
. If the \parindent
is large enough, the paragraphs will get ugly.
Note: this does not prevent hyphenation. So the minimal amount is not enforced by an hbox or so. This is an exercise left to the ambitious reader.
Edit: do not hardcode glyph ids...