From 9776331de00e9051dcf9d76c88e2580f0d78f688 Mon Sep 17 00:00:00 2001 From: bdeshi Date: Mon, 14 Sep 2026 23:06:37 +0600 Subject: [PATCH] Revert lever 3; record why the parfillskip lever cannot be tuned MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A finite \parfillskip was tried at 0.75\textwidth (no effect) and then, after deriving the threshold, at 0.15\textwidth (real effect, bad trade). Badness is 100(G/X)^3 against tolerance 4000, so the threshold is G ~ 3.4(X + 24pt): on a 430pt measure any X at or above 0.25\textwidth prescribes a threshold longer than the measure and can never fire. The only values in range are 0.15 and 0.10, and 0.10 bites harder — so the lever is effectively binary. At 0.15 it did what it promised and cost more than it bought: paragraph-final mean 161.7 -> 142.7, p90 319 -> 267, max 398 -> 341 paragraph-internal median 22.8 -> 35.7pt, >3em short 29.4% -> 48.0% underfull boxes 123 -> 1902 There are far more interior lines than final ones. Back to ragged2e's default, with the derivation kept in the preamble so this is not rediscovered by experiment a third time. Net of all five levers: 5 fixed a real conflict, 2 and 4 are harmless and near-inert here (the ragged right margin is never reached, and only 1.6% of lines begin with a protrudable character), 1 and 3 were reverted as measurably harmful. Rag is within ~1% of where it started. Co-Authored-By: Claude Opus 5 --- src/preamble.tex | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/preamble.tex b/src/preamble.tex index 22139a2..00ae47e 100644 --- a/src/preamble.tex +++ b/src/preamble.tex @@ -42,10 +42,16 @@ % emptied the log of underfull-box warnings, which looked like a win and was only the % goalposts moving. Do not raise it again without measuring (tools: work/rag.py). \setlength{\RaggedRightRightskip}{0pt plus 2em} -% Lever 3: the default \parfillskip of 0pt plus 1fil accepts a last line of any length. -% A finite fill makes TeX score a very short last line as badness and rearrange to -% avoid one. -\setlength{\RaggedRightParfillskip}{0pt plus 0.75\textwidth} +% \parfillskip stays at ragged2e's default (0pt plus 1fil: a last line may be any +% length). A finite fill was tried twice on 2026-09-14 and is not worth it. Badness is +% 100(G/X)^3 for a gap G against stretch X and \tolerance=4000 accepts up to G ~ 3.4X, +% with \rightskip adding its own 24pt — so on this 430pt measure any X at or above +% 0.25\textwidth prescribes a threshold longer than the measure and can never fire +% (0.75\textwidth was tried first and changed nothing at all). The only values in range +% are 0.15 and 0.10\textwidth, and at 0.15 the cost lands on the interior lines: last +% lines improve (p90 gap 319 -> 267pt) but paragraph-internal median rag goes 22.8 -> +% 35.7pt, lines more than 3em short 29.4% -> 48.0%, and underfull boxes 123 -> 1902. +% There are far more interior lines than final ones. Measured with work/rag.py. % The first line indents 1.6em; set here so \RaggedRight applies it rather than % relying on the direct \parindent assignment further down to repair it afterwards. \setlength{\RaggedRightParindent}{1.6em}