A repaired and extended build of Norm Sans by Joshua Shao.
Seven weights, fourteen styles, OTF · TTF · WOFF · WOFF2.
Norm is a contemporary sans-serif that blends monospace functionality with modernist geometric accents, bridging computational and humanist traditions. GK Norm keeps that design and fixes what the files could not draw.
Norm Sans mapped 171 codepoints. Thirty-eight of them were mapped to empty outlines: the character occupied its full advance width and drew nothing. Another 57 were missing from the italic faces entirely, so they fell through to whatever font the reader happened to have.
Neither shows up as an error. A font checker reports the glyph as present, and the page silently sets a blank space or a stranger's letterform.
| Norm Sans | GK Norm | |
|---|---|---|
| Codepoints mapped | 171 | 293 |
| Mapped but blank | 38 | 0 |
| Missing from the italics | 57 | 0 |
| Accented Latin characters | 0 | 111 |
Accented Latin. Norm Sans had none at all: no é, ö, ñ, ü, ç. Any non-English name broke mid-word into a fallback font. GK Norm adds 111 accented and extended Latin characters, each mark drawn from its own face's stroke weight.
The apostrophe. ' was an empty outline in eight of the fourteen faces. Typing one in Light, Medium or Semibold produced blank space.
The no-break space. U+00A0 was absent from the cmap, so every one was set by a fallback font at a different width.
Curly quotes. U+2018 and U+201C shipped byte-identical to U+2019 and U+201D. Opening and closing marks drew the same shape, so "quoted" text had no direction. Both are redrawn, along with the comma and the low quotes.
Arrows. All ten of ←↑→↓↔↕↖↗↘↙ were blank in the uprights and unmapped in the italics.
Symbols. × ÷ ± ° « » ‹ › ≤ ≥ ≠ ¬ ¦ † ‡ ® ‰ ∞ √ ∫ ∂ ∑ ∏ ∅ ◊ ≈ ¤ − were all mapped to nothing.
Spacing accents. ` ´ ¨ ˆ ˇ ¯ ˚ ˘ ˙ ¸ ˛ can be typed on their own. That includes the backtick, which is ASCII and had never been in the font.
Bold and italic now link. Every face declared itself Regular: fsSelection carried only the REGULAR bit, and macStyle was zero even on Bold Italic. Applications could not tell the styles apart and synthesised their own slanted, emboldened versions instead of using the real ones.
Metadata. The files shipped with no copyright, licence, designer or vendor entries. All are set, so attribution travels with the binary.
Vertical metrics. A font states its line box three times, and these three disagreed while the flag that settles which one wins was off, so the same paragraph set at a different leading depending on the platform. The typo and hhea values now match, USE_TYPO_METRICS is set, and the win values are taken from the family's real ink. That last part fixed a clipping bug: ink reaches 1048 units against a win ascent of 900, so accented capitals were being cut off on Windows.
WOFF2. Added. It is the format every modern browser reaches for first, and the one the upstream repository did not build.
Download a release, or take the files from fonts/.
For the web, @font-face resolves against the family name you declare, not the name inside the file, so GK Norm drops into an existing Norm setup without touching a stylesheet:
@font-face {
font-family: 'Norm'; /* keep whatever name you already use */
src: url('GKNorm-Regular.woff2') format('woff2'),
url('GKNorm-Regular.woff') format('woff');
font-weight: 400;
font-style: normal;
}Every added glyph is generated, not hand-placed. Each shape is measured off the face it is drawn into. The hyphen gives the stroke weight and the plus gives the mathematical axis, so one construction serves Thin through Bold without per-weight tables.
python3 -m pip install -r tools/requirements.txt
python3 tools/build-arrows.py # the ten arrows
python3 tools/build-quotes.py # comma, quotation marks, low quotes
python3 tools/build-symbols.py # the symbols that were mapped but empty
python3 tools/build-math.py # mathematical operators
python3 tools/build-ascii.py # empty ASCII glyphs, spaces
python3 tools/build-accents.py # accented Latin
python3 tools/build-metrics.py # vertical metrics, from the family's ink
python3 tools/build-webfonts.py # WOFF2
Five gates guard the result, each one tested against a deliberately broken build so a green result means something:
python3 tools/verify-coverage.py # nothing mapped draws blank; uprights match italics
python3 tools/verify-quotes.py # opening and closing quotes are distinct
python3 tools/verify-arrows.py # every arrow is mapped and inked
python3 tools/verify-fonts.py # OTS, the sanitiser browsers run on a font
python3 tools/verify-marks.py # cedillas and ogoneks join their letters
GK Norm is a fork of Norm Sans by Joshua Shao, maintained by GravityKit.
The arrow construction follows a pull request by Arthur Kim, generalised across the weights. The comma and quotation marks derive from Share Tech by Carrois Type Design.
Everything here is under the SIL Open Font License 1.1: free to use, modify, and redistribute, commercially or otherwise. Norm Sans reserves no font name; Share Tech reserves "Share", which is not used here.
Issues and pull requests are welcome at GravityKit/GK-Norm. If you are adding glyphs, add them to the relevant tools/build-*.py script rather than editing the binaries, and make sure the four gates still pass.
Fixes that belong upstream are worth sending to jhuashao/norm-sans as well.
