Plates full-measure inside quotations; rag levers measured

\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 <noreply@anthropic.com>
This commit is contained in:
2026-09-14 21:33:42 +06:00
co-authored by Claude Opus 5
parent 1caa701057
commit 4116c4eca6
+41 -17
View File
@@ -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}