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:
+41
-17
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user