Kerning ↩
Basics
Kerning is the local optimization of whitespace between of glyphs by adding/subtracting a certain number of units from the default spacing.
Kerning is expressed as a list of glyph pairs and corresponding kerning values:
# pseudocode
V A −50
T a -40
f parenright 95
Kerning pairs can also be defined using kerning groups – this allows us to cover a larger number of combinations with fewer pairs.
# pseudocode
@T_right: T Tcommaaccent Tcaron Tcedilla Tbar
@r_right: r racute rcaron rcommaaccent
@A_left: A Aacute Acircumflex Agrave Atilde
@a_left: a aacute acircumflex agrave atilde
@f_left: f fi fl germandbls
V @A_left −50
@T_right @a_left -40
@r_right @f_left 15
A kerning group should contain glyphs which share the same left- or right-side shape. These can be accented versions of a base glyph, ligatures, or any other glyph with similar forms.
Naming of kerning groups
The pseudocodeAn informal high-level description of the operating principle of a computer program or other algorithm. example above demonstrates a problem with using left
and right
in kerning group names. These qualifiers can mean two opposite things:
- glyphs which are the left/right glyph in a kerning pair
- glyphs which share the same left/right-side shape
In addition to this, there’s also the fact that writing direction can be left-to-right or right-to-left depending on the script – this affects the kerning direction as well.
To remove this ambiguity, it is recommended to think about kerning in terms of “first” and “second” glyphs in a pair. This is in line with the UFO3 specification which defines public.kern1.
and public.kern2.
as standard prefixes for kerning groups.
With that in mind, here’s an updated version of the above example:
# pseudocode
@T_1st: T Tcommaaccent Tcaron Tcedilla Tbar
@r_1st: r racute rcaron rcommaaccent
@A_2nd: A Aacute Acircumflex Agrave Atilde
@a_2nd: a aacute acircumflex agrave atilde
@f_2nd: f fi fl germandbls
V @A_2nd −50
@T_1st @a_2nd -40
@r_1st @f_2nd 15
Kerning in OpenType fonts
The OpenType format has two places for storing kerning data:
- kern table
-
The
kern
table is a simple flat table with kerning pairs and values. Originally a TrueType table, it is also allowed in OpenType-CFF fonts (but not supported by all engines).→ Use it only for compatibility with legacy environments.
- kern feature
-
Kerning data can also be expressed as GPOSGlyph Positioning table, a table in the OpenType font format which provides precise control over glyph placement. Used for sophisticated text layout and rendering using the script and language system definitions in the font. feature code. This allows other kerning patterns such as triplets and quadruplets, adjustment of glyph placement independent of the advance adjustment, etc.
→ This is the recommended kerning mechanism for OpenType fonts.
A font may contain both types of kerning, for use by different environments.
Kerning in UFO
There are two ways in which kerning data can be stored in UFOs:
- kerning.plist
- Kerning pairs and values are stored as XML and can be accessed with Python at
font.kerning
. - features.fea
- Kerning data is stored as OpenType code in a
.fea
file, and can be accessed with Python atfont.features
– but only as a big string with all other features.
From UFO kerning to OpenType kerning
Only one type of kerning is used when generating OpenType fonts, and kerning in the kern
feature has precedence over font.kerning
.
-
If the font contains a
kern
feature, then any data infont.kerning
is ignored. -
If
font.kerning
contains data and the font does not contain akern
feature, RoboFont will generate thekern
feature automatically for the pairs infont.kerning
.
Typeface used in the illustrations: IBM Plex Serif