A digital revival of Monotype Modern No. 8A, the typeface of the Bulletin of the American Mathematical Society in the 1940s, for LaTeX. It is named after W. H. Mills, A prime-representing function (Bull. AMS 53, 1947), the page this project started from.
To see it at its real size, print mills-specimen-a4.pdf or
mills-specimen-letter.pdf at actual size (100%, not
"fit to page"): the text is then 11 pt, as in the 1947 Bulletin.
Monotype Modern 8A (Lanston Monotype's series 8, roman with italic) is a Scotch-style "modern" face: strong contrast, ball terminals, cast in hot metal and printed by letterpress. It was a standard face of American mathematical printing from the 1920s to the 1960s, and it is the face Knuth modelled Computer Modern on. Mills 8A is not a redrawing. Its glyphs are traced from the type itself: averaged from about 900,000 letter impressions on 461 scanned pages of the Bulletin and the Transactions (1940–1948). The shapes, the weight of the ink, the Monotype unit widths and the real 1947 script sorts are all as they were printed.
The Mills page as printed in 1947 (left), and reset from the LaTeX source in Mills 8A (right):
mills-compare.pdf has the two side by side and then
each on its own page; mills-8a.pdf is the page alone.
Six more first pages from the scans, reset the same way
Each reset is in tex/pages/, set with tex/bulletin1947.sty; ./compare-pages.sh rebuilds
the images from the scans.
P. Erdős, Some asymptotic formulas for multiplicative functions, Bull. Amer. Math. Soc. 53 (1947)
J. L. Doob, Probability in function space, Bull. Amer. Math. Soc. 53 (1947)
M. Kac, On the notion of recurrence in discrete stochastic processes, Bull. Amer. Math. Soc. 53 (1947)
E. L. Post, Recursively enumerable sets of positive integers and their decision problems, Bull. Amer. Math. Soc. 50 (1944)
S. Wright, Statistical genetics and evolution, Bull. Amer. Math. Soc. 48 (1942)
Th. von Kármán, The engineer grapples with nonlinear problems, Bull. Amer. Math. Soc. 46 (1940)
The built fonts are in the repository, so nothing needs to be built:
git clone https://github.com/heiner/mills8a && cd mills8a
./make-tds.sh # assemble the TeX tree (build/tds) and mills8a.tds.zip
./install.sh # copy it into your personal TeX tree (TEXMFHOME)
install.sh puts the files where TeX looks by default (~/texmf on
Linux, ~/Library/texmf on macOS: whatever kpsewhich -var-value TEXMFHOME says), so no environment variables and no updmap are needed:
the package loads its own map file. Alternatively unzip
mills8a.tds.zip into that directory yourself.
- MiKTeX: unzip
mills8a.tds.zipinto a new directory, add it as a root directory (MiKTeX Console → Settings → Directories) and refresh the file name database. - dvips (
latex+dvipsinstead ofpdflatex): also run./install.sh --dvips, which enables the map file withupdmap-user.
\usepackage{mills8a} % or [osf] for old-style figures in textThe Bulletin set 11 pt type on 12 pt leading; tex/mills.tex is a complete
example, including the 1947 script positions.
| font | contents |
|---|---|
| Mills8A-Regular | roman, small caps, f-ligatures, lining and old-style figures, accents (Latin-1, Latin Extended-A) |
| Mills8A-Italic | italic, Greek, f-ligatures |
| Mills8A-Bold, -BoldItalic | bold (from the titles); bold italic (synthesized) |
| Mills8A-Regular9, -Italic9 | the 9 pt cut, for footnotes and references |
| Mills8A-Math | the 1947 letters, Greek, operators, relations, Fraktur, display ∑ ∏ ∫, and the real first- and second-order script sorts for indices |
The family is also built as OpenType fonts (revival/fonts, with an OpenType
math font) for LuaLaTeX and other software. They can set each letter as one
of up to 8 real 1947 impressions at random (feature rand); tex/mills.tex
run with LuaLaTeX shows the setup (fontspec, unicode-math); the
installed tree includes them, so they are found by file name. The
difference from the pdfLaTeX page is slight.
More on how it was made
- Segment each 600 dpi page into glyph impressions, with Tesseract for a
first reading and the page's lines (
revival/segment.py,baselines.py). - Normalize the scans: each paper's ink weight and type size are measured
against the Erdős paper and corrected (
docweight.py). - Cluster identical sorts and label them (
cluster.py,classify.py,assign.py). Rules do most of it;overrides.tsvholds the hand corrections, each naming one impression, so re-clustering does not invalidate it. - Average each sort's impressions at 4× resolution, aligned to ¼ px
(
masters.py). Old-style figures come from the years in the Bulletin's running heads (oldstyle.py). - Trace and space the masters into OpenType fonts (
build_font.py). Side bearings are fitted from about 440,000 letter pairs in the text and land on Monotype's 18-unit grid. Then accents (accents.py), the math font on Latin Modern Math's tables (build_math.py), bold and 9 pt (build_sizes.py), and the pdfLaTeX fonts (pdftex/build_pdftex.py). - Check:
check_fonts.pytests baselines, heights, side bearings and the script sorts of every font, andproof/has proof sheets of everything the family sets.
revival/README.md describes each step, the measurements behind it, and
where each glyph comes from.
Traced from the 1940s scans (each glyph the average of its printed impressions):
- every roman and italic letter and figure at 11 pt, the roman J from its 9 pt sort (66 impressions) scaled up;
- the old-style figures, from the years in the Bulletin's running heads;
- punctuation, with the 1947 quotes ‘ ’ “ ”, the question mark (10 impressions) and the en dash (a 9 pt sort, scaled);
- the accented ü á (roman) and ü Ü ä (italic), and the dieresis;
- 23 small capitals;
- bold, from the title lines and run-in heads (told by the word, not the letter): the capitals but J K X Z, the lowercase but q w z, the figures 0–7 and the hyphen;
- Greek (with Γ Σ Φ and θ), most math operators and relations, ∮ ∨, the display ∑ ∏ ∫, Fraktur 𝔄 𝔅 ℭ 𝔇 𝔊 𝔎 𝔔 ℜ ℑ 𝔖 𝔗 𝔛 and script 𝒜 𝒞 ℒ 𝒰;
- the 9 pt cut: 80 roman and 54 italic sorts;
- 43 script sorts for indices (40 first-order, 3 second-order), among them the short 1947 index arrow.
Filled in otherwise:
- from the 1922 Lanston Specimen Book (No. 8A at 9–18 pt): small caps
J Q X and
$; - built from 1947 sorts: the fl/ffl and italic ffi/ffl ligatures,
the em dash, the colon and ellipsis,
\cdotand\cdots(from the period), bold J K X Z q w z 8 9 and bold italic (thickened, to the real bold's weight and x-height), and the script sizes that have no legible real sort (the text glyph scaled: among them the index 2 3 4 8, whose real sorts fill in); - from Latin Modern, thickened to the type's weight: accents other than the
dieresis (the acute of á and é is real only in those letters), rarer punctuation and symbols (
# % @† ‡ ¶ « » ß Æ Œ Ø Ł and so on), and the math symbols the scans lack.
Spacing is measured as well: side bearings from about 440,000 letter
pairs in the text, the thin space 1947 set before : and ;, and the
script positions and gaps of the Mills page. A few bearings that the
pairs cannot fix (the small-cap A before a period) are set by hand from
the scans.
- The scans: Bulletin and Transactions of the AMS, 1940–1948, from the AMS back-issue archive. Only the crops in the comparisons are included here.
- The Monotype Specimen Book of Type Faces, Lanston Monotype, 1922 (public domain).
- Latin Modern and Latin Modern Math: some text glyphs and the base of
Mills8A-Math.otf.







