01 β Typography (`PRINT-TYPO`)
Status: NORMATIVE reference. Internal print-safe guardrail.
Scope: Legibility of the ink-on-paper visual layer. Accessibility semantics (tags, roles, alt text, tab order) live in a structural layer that does not print; the visual layer must independently carry every legibility affordance. These requirements govern that visual layer.
Related: Issue #2852 Β· INVENTORY.md Β· 02-color-contrast-and-ink.md
Framing note (read before using the numbers)
Almost none of the print-typography canon is law. The point-size floors, leading ratios, and measure limits below are consensus practice β widely converged recommendations from vision-accessibility bodies (CNIB, UKAAF, APH, RNIB, Round Table) and typographic research, not regulation. Statutory type-size mandates that do exist are document-class-specific (CMS ABN, 42 CFR Part 422/423 Medicare materials, 21 CFR 201.66 Drug Facts) and live in 00-legal-basis.md, not here. Where a requirement below carries MUST, it is because it derives from a WCAG-intent hard rule (e.g. do-not-rely-on-visual-formatting-alone), not because a point size is legally fixed.
Two audiences, two floors β do not conflate them:
- General-audience Clear Print floor (
PRINT-TYPO-001): the minimum for ordinary documents read by the general public. 12 pt. - Large-print alternate spec (
PRINT-TYPO-004): a separate deliverable produced on request for readers with low vision. 18 pt. This is an alternate format, not an upgrade of the base document.
PRINT-TYPO-001 β Body text minimum point size (general-audience Clear Print floor)
Level: SHOULD
Applies to: all documents
Source: CNIB Clear Print Accessibility Guidelines (2020); UKAAF Creating clear and large print documents (G003); Round Table Guidelines for Producing Clear Print (2022)
Source strength: consensus standard
Machine-checkable: yes
Validation: Extract the effective rendered point size of the dominant body text run. Measure post-scale β a 12 pt glyph printed on a page scaled to 92% renders at ~11 pt (see PRINT-SUBSTRATE-008). Flag any body run whose rendered size < 12 pt. Units: PostScript points (1 pt = 1/72 in).
Body text SHOULD be set at no less than 12 pt for general-audience print, and 14 pt SHOULD be preferred where the audience skews older or low-vision. Sizes below 12 pt SHOULD be reserved only for content with a statutory carve-out and no accessible alternative.
Rationale: Below ~12 pt, readers with mild-to-moderate low vision, presbyopia, or reduced acuity cannot resolve glyphs at normal reading distance without magnification β which paper does not provide. Excludes the large and growing older-adult readership.
Implementation notes: Preserve βflyerβ pipeline: never down-scale a source body run below 12 pt to fit a page; flag instead. Reflow/WeasyPrint: set a base font-size floor of 12 pt in the print stylesheet and forbid @media print rules that shrink below it. Audit/ACR tooling: report the rendered (post-page-scale) size, not the nominal CSS/px size. Tag-tree editor: point size is a visual property invisible to the tree β surface it in the geometry inspector, not the structure panel.
PRINT-TYPO-002 β Caption / secondary text minimum size
Level: SHOULD Applies to: all documents Source: CNIB Clear Print (2020); UKAAF G003 Source strength: consensus standard Machine-checkable: yes Validation: Identify text runs classified as captions, sidebars, callouts, or secondary annotations (by style role or relative size); flag rendered size < 10 pt. Units: points.
Caption and secondary text SHOULD be no smaller than 10 pt, and SHOULD track no more than 2 pt below the body size rather than shrinking to a fixed small value.
Rationale: Captions carry the accessible substitute for image content on paper (see PRINT-LAYOUT-008); if the caption is unreadable the image is effectively undescribed for low-vision readers.
Implementation notes: Preserve pipeline: caption geometry is often inherited from the source and frequently violates this β flag rather than silently enlarge (enlarging can break layout reflow). WeasyPrint: define a .caption class floor. Audit: treat caption size as a distinct metric from body size.
PRINT-TYPO-003 β Footnote & legal-disclaimer minimum size (where not statutorily fixed)
Level: SHOULD
Applies to: all documents
Source: CNIB Clear Print (2020); UKAAF G003 (consensus). Statutory minimums for specific disclaimers live in 00-legal-basis.md.
Source strength: consensus standard
Machine-checkable: partial
Validation: Flag footnote/disclaimer/fine-print runs rendered < 10 pt. βPartialβ because deciding whether a given jurisdiction fixes a higher statutory minimum for this document class is not automatable. Units: points.
Footnotes, endnotes, and legal disclaimers SHOULD be set at no less than 10 pt unless a governing statute fixes a different (higher) minimum, in which case the statutory minimum controls. Fine print SHOULD NOT be used to hide material terms below the general legibility floor.
Rationale: Sub-8-pt βmouse printβ is a deliberate legibility barrier that disproportionately excludes low-vision and older readers from consequential terms (consent, cost, rights).
Implementation notes: Preserve pipeline: 6β8 pt disclaimer blocks are common in source PDFs and are a frequent flag. Do not auto-resize legal text β flag for human review, because reflowing a disclaimer can change page pagination and, for consent forms, legal validity (see PRINT-FORM-011).
PRINT-TYPO-004 β Large-print alternate body size (APH/CCLVI spec, distinct from 001)
Level: SHOULD Applies to: large-print alternates only Source: American Printing House for the Blind, Research-Based Guidelines for the Development of Documents in Large Print (2022); CCLVI large-print guidance Source strength: consensus standard Machine-checkable: yes Validation: For a deliverable declared as a large-print alternate, flag dominant body size < 18 pt. Units: points.
A document produced as a large-print alternate SHOULD set body text at no less than 18 pt (APH large-print threshold), with 14 pt regarded only as an interim βenlargedβ grade, not true large print. This is a distinct deliverable from the 12 pt general-audience base document in PRINT-TYPO-001 and MUST NOT be treated as satisfying the base-document floor, nor vice versa.
Rationale: Readers who request large print have acuity loss for which 12 pt is insufficient; 18 pt is the point at which legibility gains become consistent for that population. Delivering 12 pt and calling it βthe accessible versionβ fails the effective-communication duty for those readers.
Implementation notes: This governs a separate output profile, not the default. Reflow/WeasyPrint is the correct engine for large print (photocopy enlargement does NOT conform β see PRINT-ALT-002): re-set at 18 pt and re-flow the measure, do not scale the page up. Audit/ACR: a document can pass PRINT-TYPO-001 and still owe a PRINT-TYPO-004 alternate on request.
PRINT-TYPO-005 β Typeface selection; what βsans serifβ does and does not buy
Level: SHOULD Applies to: all documents Source: CNIB Clear Print (2020); UKAAF G003; APH (2022) Source strength: consensus standard Machine-checkable: partial Validation: Detect the family in use; flag decorative/display/script faces and faces with known ambiguous character pairs for body text. βPartialβ because legibility is a family property not fully derivable from the name; maintain an allow/deny list. Units: none (categorical).
Body text SHOULD use a standard, well-hinted face with unambiguous, clearly differentiated characters (distinct 1/l/I, 0/O, rn/m) β commonly a humanist sans serif such as Arial, Verdana, or Tahoma, or a clean serif at adequate size. Decorative, condensed, script, and low-legibility display faces SHOULD NOT be used for extended text.
Choosing a sans serif buys character disambiguation and simplicity of stroke; it does not by itself guarantee legibility β spacing, size, weight, and contrast (PRINT-TYPO-006β009, 02-color-contrast-and-ink.md) matter as much or more, and APH ranks spacing and size above style.
Rationale: Ambiguous glyph pairs cause misreads that hurt readers with low vision, dyslexia, and cognitive disabilities; condensed/decorative faces compound this.
Implementation notes: Preserve pipeline: we do not re-typeset the base document, so this is advisory/flag-only there. Large-print and reflow outputs: pick from a vetted allow-list. Font-embed step already exists (fontsub.py) β extend it to record the family for audit, not to substitute silently (substitution can change metrics and pagination).
PRINT-TYPO-006 β Weight / stroke-contrast limits (avoid hairline & ultra-thin)
Level: SHOULD Applies to: all documents Source: APH (2022); CNIB Clear Print (2020) Source strength: consensus standard Machine-checkable: partial Validation: Flag body runs set in weights below Regular (e.g. Thin/Light/Hairline, weight < 400) and faces with high thin/thick stroke-contrast (modern/Didone) at body sizes. βPartialβ β weight class is readable from font metadata but stroke-contrast is a design property. Units: CSS/OpenType weight class.
Body text SHOULD be set no lighter than Regular (400), and hairline/ultra-thin weights and high-stroke-contrast faces SHOULD NOT be used for extended text or, especially, for reverse-out text (see PRINT-TYPO-013).
Rationale: Thin strokes break up under toner scatter, ink spread, and photocopying, and vanish for low-vision readers; the thin strokes of high-contrast faces disappear first.
Implementation notes: Preserve pipeline: flag light-weight body runs. Reverse-out (light-on-dark) magnifies the problem because ink spread eats the light glyph β pair this check with PRINT-COLOR/PRINT-TYPO-013.
PRINT-TYPO-007 β Letter-spacing / tracking floor
Level: SHOULD Applies to: all documents Source: CNIB Clear Print (2020); APH (2022) β APH ranks spacing as the single highest-impact legibility characteristic Source strength: consensus standard Machine-checkable: partial Validation: Flag negative tracking (letter-spacing < 0) on body runs and any run whose measured average glyph advance is compressed below the fontβs natural metrics. βPartialβ β negative tracking is detectable; βenough positive spaceβ is a judgment. Units: em or pt of tracking.
Body text SHOULD NOT use negative letter-spacing (tracking), and large-print alternates SHOULD use slightly open tracking. Default font metrics are the floor; tightening below them SHOULD NOT be done to fit copy.
Rationale: Tight tracking merges adjacent glyphs (rnβm), which is exactly the failure mode that hurts low-vision, dyslexic, and cognitively disabled readers most. APH places spacing above size and contrast in impact.
Implementation notes: Preserve pipeline: negative tracking applied to squeeze a headline is a flaggable pattern. WeasyPrint/large-print: never use letter-spacing to fix overflow β reduce copy or increase measure/page.
PRINT-TYPO-008 β Word-spacing constraints
Level: SHOULD
Applies to: all documents
Source: CNIB Clear Print (2020); APH (2022)
Source strength: consensus standard
Machine-checkable: partial
Validation: Detect abnormally compressed or (more often) abnormally stretched inter-word gaps; the latter is the βriversβ symptom of justified text (see PRINT-TYPO-011). Flag runs whose word-space variance is high. Units: em or measured px gap.
Word spacing SHOULD be even and near the font default; it SHOULD NOT be compressed to fit, nor stretched into large uneven gaps. Large uneven word gaps SHOULD be treated as a symptom of justification and resolved by ragging the text right rather than by re-spacing.
Rationale: Uneven word spacing forces readers to re-fixate to find word boundaries, slowing or breaking reading for low-vision and cognitively disabled users.
Implementation notes: Because the dominant cause is justification, the practical fix lives in PRINT-TYPO-011. Audit: report word-space variance as a proxy signal for justified body text.
PRINT-TYPO-009 β Leading (line spacing) as a ratio of point size
Level: SHOULD Applies to: all documents Source: CNIB Clear Print (2020) β leading β₯ 25β30% over point size; APH (2022) β β₯ 1.5Γ for large print Source strength: consensus standard Machine-checkable: yes Validation: Compute leading Γ· point size. Flag ratio < 1.25 for general print; < 1.5 for large-print alternates. Units: dimensionless ratio (line-height / font-size).
Line spacing SHOULD be at least 1.25Γ the point size for general-audience print (i.e. β₯25% over point size), and at least 1.5Γ for large-print alternates. Solid or negative leading SHOULD NOT be used for body text.
Rationale: Tight leading makes the eye lose or double the line on return-sweep β a documented failure for low-vision and dyslexic readers. Adequate leading is one of the highest-value, lowest-cost legibility levers.
Implementation notes: Preserve pipeline: leading is measurable from text-line baselines; flag ratio < 1.25. WeasyPrint: set line-height: 1.5 in the large-print profile, β₯1.3 in the general profile. This is one of the few TYPO rules cleanly machine-checkable β prioritize it in the audit.
PRINT-TYPO-010 β Measure / line length in characters
Level: SHOULD
Applies to: all documents
Source: APH (2022) large-print measure (39β43 cpl, canonical in PRINT-ALT-001); general typographic consensus (~45β75 cpl, ~66 ideal)
Source strength: consensus standard
Machine-checkable: partial
Validation: Estimate characters-per-line from column width Γ· average glyph advance. Flag general-print body columns consistently > 90 cpl or < 40 cpl (the < 40 flag does not apply to the 39β43 cpl large-print profile). βPartialβ β cpl is estimated, not exact, and varies with content. Units: characters per line (cpl).
Body text measure SHOULD fall roughly within 45β75 characters per line (target ~66) for general print, and the shorter 39β43 cpl for the large-print profile (canonical in PRINT-ALT-001 β large print uses a shorter measure to ease the return-sweep, not a longer one). Full-page-width single columns at small type (very long measure) SHOULD be avoided.
Rationale: Over-long lines make return-sweep error-prone (compounding tight leading); over-short lines fragment reading. Both disproportionately affect low-vision and cognitively disabled readers.
Implementation notes: Preserve pipeline: advisory flag only (we do not re-flow the base). Reflow/large-print: measure is a first-class layout parameter β constrain the large-print column so the 39β43 cpl measure (PRINT-ALT-001) holds at 18 pt, which forces a single narrow column; for general print target ~66 cpl.
PRINT-TYPO-011 β Avoid justified text & hyphenation (rag-right)
Level: SHOULD Applies to: all documents Source: APH (2022) β ragged right preferred; UKAAF G003; CNIB Clear Print (2020) Source strength: consensus standard Machine-checkable: yes Validation: Detect full justification (both margins flush) and frequent end-of-line hyphenation in body blocks. Flag justified body paragraphs and hyphenation-heavy blocks. Units: boolean per block + hyphenation rate.
Body text SHOULD be set left-aligned / ragged right, not fully justified, and automatic hyphenation SHOULD be minimized. Justification SHOULD NOT be used for extended body copy.
Rationale: Justification creates uneven word spacing and βriversβ (PRINT-TYPO-008); heavy hyphenation breaks words across lines. Both raise cognitive load and hurt low-vision and dyslexic readers.
Implementation notes: Preserve pipeline: justification is detectable from glyph positions (both margins flush + variable gaps) β flag it. WeasyPrint: use text-align: left; hyphens: manual in the print/large-print stylesheet; never justify.
PRINT-TYPO-012 β Avoid all-caps / small-caps for extended text (word-shape)
Level: SHOULD Applies to: all documents Source: CNIB Clear Print (2020) β upper-case not recommended for emphasis; UKAAF G003 Source strength: consensus standard Machine-checkable: partial Validation: Detect runs of >~3β4 consecutive all-caps words in body context. Flag extended all-caps/small-caps body runs. βPartialβ β short acronyms and headings are legitimate; only extended body use is the violation. Units: run length in words.
Extended body text SHOULD NOT be set in all-caps or small-caps. Capitalization SHOULD be reserved for short headings, acronyms, and labels. Emphasis SHOULD use bold, not caps (or italics β see PRINT-TYPO-013).
Rationale: All-caps removes ascender/descender word-shape cues that fluent readers rely on, slowing reading and disproportionately harming low-vision, dyslexic, and cognitively disabled readers.
Implementation notes: Preserve pipeline: flag long all-caps runs (watch for CSS text-transform: uppercase in HTML-sourced PDFs, which wonβt show in the character stream). Reflow: strip text-transform: uppercase from body selectors in the print profile.
PRINT-TYPO-013 β Limit italics / underline / reverse-out for body text
Level: SHOULD Applies to: all documents Source: CNIB Clear Print (2020) β italics not recommended for emphasis; APH (2022) β reverse-out cautioned Source strength: consensus standard Machine-checkable: partial Validation: Flag extended italic body runs, underlined runs, and light-on-dark (reverse-out) body blocks. βPartialβ β brief emphasis is fine; only extended use is flagged. Underline detection distinguishes true underline from link styling. Units: run length + boolean reverse-out.
Extended body text SHOULD NOT be set in italics, underlined, or reversed out (light on dark). Emphasis SHOULD use bold. Where reverse-out is used for design, the type SHOULD be enlarged and heavier (PRINT-TYPO-006) and never hairline, because ink spread erodes light-on-dark glyphs.
Rationale: Italics slant strokes off the reading axis and thin them; underlines collide with descenders; reverse-out loses stroke to ink spread β each hurts low-vision and dyslexic readers. Reverse-out interacts with contrast (PRINT-COLOR-002).
Implementation notes: Preserve pipeline: flag extended italic/underline/reverse-out. Reverse-out is a joint TYPO+COLOR concern β cross-check with the contrast target in 02-color-contrast-and-ink.md.
PRINT-TYPO-014 β Text over images or tinted panels β legibility floor
Level: SHOULD
Applies to: all documents
Source: APH (2022); WCAG 1.4.3 intent applied to reflectance (see PRINT-COLOR-002)
Source strength: consensus standard
Machine-checkable: partial
Validation: Detect text runs overlapping raster images or tint fills; sample local background reflectance under the text and check the print-contrast target of PRINT-COLOR-002 at the worst-case local patch, not the average. βPartialβ β requires rasterizing the composited page and sampling. Units: reflectance-contrast per PRINT-COLOR-002.
Text set over an image or tinted panel SHOULD meet the print-contrast target of PRINT-COLOR-002 against the darkest/most-similar local region it overlaps, not merely on average. Where a photograph cannot guarantee this, text SHOULD be moved off the image or given a solid backing plate.
Rationale: Busy or variable backgrounds destroy local contrast even when average contrast looks fine, making text vanish in patches β a severe low-vision barrier and worse after monochrome printing (PRINT-COLOR-003).
Implementation notes: Preserve pipeline: flyer sources love white text on photos β this is a top flag. Compose the page to a raster, sample the region under each glyph, evaluate against PRINT-COLOR-002. Recommend a backing plate rather than shifting hue.
PRINT-TYPO-015 β Orphan/widow control where it harms comprehension (not aesthetics)
Level: MAY Applies to: all documents Source: general typographic consensus Source strength: industry practice Machine-checkable: partial Validation: Detect a single line of a paragraph stranded at the top (widow) or bottom (orphan) of a page/column, and β the case that matters β a heading stranded at the bottom of a page with its content overleaf. Units: boolean per break.
Pagination MAY control orphans and widows, and SHOULD avoid stranding a heading or a question separated from its content/field across a page break where doing so harms comprehension (this is the accessibility-relevant subset; pure aesthetic single-line widows are optional). See PRINT-FORM-019 and PRINT-LAYOUT for the structural cases.
Rationale: A heading or question at the foot of a page with its body overleaf breaks the readerβs model of what belongs together β a comprehension and form-completion hazard for cognitively disabled and low-vision readers, distinct from cosmetic widow control.
Implementation notes: Reflow/WeasyPrint: use break-after: avoid on headings and orphans/widows: 2. This MAY rule is low priority except for the heading-detach and form-field-detach cases, which are promoted to SHOULD in PRINT-FORM-019.