Skip to content

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.

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.


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.


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).


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.


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).


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.


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.


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.


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.


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.


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.


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.


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.


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.


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.