From 4116c4eca6569e3102284da0be1bc66c70eb6281 Mon Sep 17 00:00:00 2001 From: bdeshi Date: Mon, 14 Sep 2026 21:33:42 +0600 Subject: [PATCH] Plates full-measure inside quotations; rag levers measured MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit \platefullmeasure resets \parshape for a plate's own paragraph, so a plate keeps the full text measure even where the original interrupts a displayed quotation with one. Verified in the built PDF: plate 50 (p0130) 319.2 x 484.3 pt height-limited, unchanged plate 51 (p0131) 430.5 x 356.0 pt full measure (was 372.2) plate 97 (p0218) 430.2 x 274.8 pt full measure (was 372.2) plate 165 (p0387) 351.1 x 484.5 pt height-limited, unchanged Line-breaking levers, measured with work/rag.py over 102 paragraph-internal lines on nine text pages: 1. permitted rag 2em -> 4em: made every statistic WORSE (median rag 22.8 -> 24.8pt, sd 79.6 -> 89.1, lines >3em short 29.4 -> 35.3%) and emptied the log of underfull warnings, which was the goalposts moving rather than a gain. Reverted; the preamble says not to try it again without measuring. 2. \linepenalty=30: no measurable change on this sample. Kept. 3. finite \RaggedRightParfillskip: inert as set — 0.75\textwidth is 322.5pt of stretch, past the 90th percentile of last-line rag, so it never incurs badness. Kept, pending a value that bites. 4. protrusion factor 1100 -> 1500: below the resolution of a line-ending metric; it changes how even the rag looks, not where lines break. Kept, unquantified. 5. \emergencystretch was set to 3em and silently overridden to 1em lower down; the override is gone. No visual effect (zero overfull either way), but the conflict was real. Also fixed: \RaggedRight assigns \rightskip, \parfillskip AND \parindent from its own parameters at every invocation, so setting those directly does nothing. All three are now set as \RaggedRight* before the call. Co-Authored-By: Claude Opus 5 --- src/preamble.tex | 58 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/src/preamble.tex b/src/preamble.tex index 9854709..22139a2 100644 --- a/src/preamble.tex +++ b/src/preamble.tex @@ -30,14 +30,36 @@ % ---- typographic settings ------------------------------------------------- % Ragged right: the original is a typescript, and unjustified setting keeps the % word spacing even — with hyphenation still on, so the rag stays shallow. +% ragged2e's \RaggedRight assigns \rightskip, \parfillskip AND \parindent from its +% own parameters every time it runs, so setting those three directly does nothing — +% they must be set as \RaggedRight*, and before the invocation below. (All three are +% \newlength; the parameter is \RaggedRightRightskip, lowercase s.) +% +% Permitted rag stays at ragged2e's 2em default. Raising it to 4em was tried on +% 2026-09-14 on the theory that giving the breaker more freedom would smooth the rag; +% measured against the same 102 lines it made every statistic worse — median rag +% 22.8 -> 24.8pt, sd 79.6 -> 89.1, lines more than 3em short 29.4% -> 35.3%. It also +% 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} +% 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} \RaggedRight +% Lever 2: prefer paragraphs with fewer lines, which removes stragglers. Operates +% strictly within a paragraph — it cannot move a paragraph boundary. +\linepenalty=30 \frenchspacing \hyphenpenalty=10000 \lefthyphenmin=62 \righthyphenmin=62 \exhyphenpenalty=50 % an already-typed hyphen may still end a line, as in the original \tolerance=4000 \emergencystretch=3em % Hanging punctuation. Dashes are wide, so they hang far less than the small % marks; quotes and full stops carry the effect. -\microtypesetup{protrusion=true,expansion=false,factor=1100} +\microtypesetup{protrusion=true,expansion=false,factor=1500} \SetProtrusion{encoding=*,family=*}{\textemdash={50,50},\textendash={80,80}} % No widows, no orphans, and a ragged bottom so pages are never stretched to % force them out. @@ -58,18 +80,23 @@ \pgmarknote{#1}{\color{black!45}\rule[-0.3ex]{0.5pt}{1.8ex}}\hspace{0.15em}\fi\ignorespaces} % \plateop{N}{no}{img}{caption}: a plate that begins original page N — the % page mark stays with the plate wherever it is placed. -% Built at \linewidth, never \textwidth: on four pages the original interrupts a -% displayed quotation with a plate (p0129/30/31/32, p0217/18, p0386/87), and inside -% extract's \addmargin the paragraph is set by \parshape to \linewidth. A minipage -% at \textwidth overhung the measure there by the quotation's 0.8in indent — which -% is also \marginparwidth, a coincidence that made it look like a margin-note fault. +% A plate is a whole page of somebody else's book, so it is set to the FULL text +% measure even where it falls inside a displayed quotation — which the original does +% on four pages (p0129/30/31/32, p0217/18, p0386/87). Inside extract's \addmargin the +% enclosing \hsize is still the full measure; only \parshape narrows the paragraph. +% \platefullmeasure resets that shape for the plate's own paragraph, which fixes both +% faults at once: the minipage no longer overhangs (it did, by the quotation's 0.8in +% indent — also \marginparwidth, a coincidence that long disguised the cause), and +% plates 51 and 99, the two of the four whose width rather than height is the binding +% constraint, are no longer reproduced 13.4% small. +\newcommand{\platefullmeasure}{\parshape 1 0pt \hsize\relax} % NB \marginnote cannot place a note inside a minipage — it falls back to % setting it inline, which overflows the measure when the plate fills the full % width. So the page mark goes outside the minipage. -\newcommand{\plateop}[4]{\par\medskip\noindent\InsertMark{origpg}{#1}% +\newcommand{\plateop}[4]{\par\medskip\platefullmeasure\noindent\InsertMark{origpg}{#1}% \hypertarget{page.#1}{}\pgmarknote{#1}% - \begin{minipage}{\linewidth}\centering - \includegraphics[width=\linewidth,height=0.74\textheight,keepaspectratio]{#3}\par\smallskip + \begin{minipage}{\hsize}\centering + \includegraphics[width=\hsize,height=0.74\textheight,keepaspectratio]{#3}\par\smallskip {\footnotesize\setstretch{1.05}\raggedright #2. #4\par}\end{minipage}\par\medskip} % \notesection: the endnotes set a step smaller and tighter than the text — % there are hundreds of them and they are consulted, not read through. @@ -230,8 +257,8 @@ \begin{center}\ifdim\wd\figbox>\linewidth \resizebox{\linewidth}{!}{\usebox{\figbox}}\else\usebox{\figbox}\fi \end{center}\par\medskip} -\newcommand{\plate}[3]{\par\medskip\noindent\begin{minipage}{\linewidth}\centering - \includegraphics[width=\linewidth,height=0.74\textheight,keepaspectratio]{#2}\par\smallskip +\newcommand{\plate}[3]{\par\medskip\platefullmeasure\noindent\begin{minipage}{\hsize}\centering + \includegraphics[width=\hsize,height=0.74\textheight,keepaspectratio]{#2}\par\smallskip {\footnotesize\setstretch{1.05}\raggedright #1. #3\par}\end{minipage}\par\medskip} % \ig{img}: an inline type specimen cut from the 300 dpi scan by % tools/crop_inline.py, set at its natural size (1 px = 1/300 in) so that @@ -273,12 +300,9 @@ % by a blank line and never indents, but it is justified, so its blank line has % a full flush line above it to sit against. Reflowed and ragged right, that cue % is much weaker, and the indent carries it instead. (Sammay, 2026-09-14.) -% NB ragged2e's \RaggedRight sets \parindent from \RaggedRightParindent, so both -% must be set or every later \RaggedRight silently zeroes the indent again. -\setlength{\RaggedRightParindent}{1.6em} +% \RaggedRightParindent is set with the other ragged2e parameters at the head of this +% file, where \RaggedRight can read it; this direct assignment only guards the value +% against anything that resets \parindent afterwards. \setlength{\parindent}{1.6em} -% transliterated words carry no hyphenation patterns; let TeX stretch a line -% rather than overrun the measure by a few points. -\setlength{\emergencystretch}{1em} \raggedbottom \setcounter{secnumdepth}{0}