How to Create Old-Style Figures in FontForge
Old-style figures—also known as non-lining or text figures—are
numbers designed to harmonize with lowercase body text through varying
x-heights, ascenders, and descenders. In FontForge, generating these
numbers involves drawing alternate numeral glyphs, properly naming them,
and configuring OpenType substitution tables using the onum
feature tag. This guide explains the exact steps required to draw, map,
and compile old-style figures directly within your font project.
1. Design the Alternate Glyphs
Old-style figures break the rigid cap-height grid of standard lining figures:
- x-height: 0, 1, and 2 typically align with the font's x-height.
- Ascenders: 6 and 8 extend upward to the ascender line.
- Descenders: 3, 4, 5, 7, and 9 drop below the baseline.
To create them in FontForge:
- Open your font file in FontForge.
- Navigate to Encoding > Add Encoding
Slots... to create empty slots for your new glyphs (enter
10slots). - Scroll to the newly created blank glyphs at the end of the font matrix.
- Right-click the first empty slot, choose Glyph
Info, and name the glyph using standard OpenType suffix
conventions:
zero.onum(orzero.oldstyle). - Repeat this naming for all ten digits (
one.onum,two.onum, throughnine.onum). - Copy the original lining figures (
zerothroughnine) into their corresponding.onumslots and modify their outlines and sidebearings to match the intended proportions and baseline alignment.
2. Add the OpenType Lookup
Once the outlines are complete, you must configure an OpenType Glyph Substitution (GSUB) table so layout engines know when to replace lining figures with old-style figures.
- Open Element > Font Info.
- Select Lookups from the left-hand menu.
- Ensure the GSUB tab is selected at the top.
- Click Add Lookup.
- Set Type to
Single Substitution. - Click the empty cell under Feature and select
onum(Oldstyle Figures) from the drop-down menu. - Click the New button under the script/language box,
select your target script (such as
latnfor Latin), and set the language toDefault. - Click OK to close the lookup dialog.
3. Populate the Substitution Subtable
With the lookup established, you must pair each default numeral to its old-style counterpart.
- With the new
onumlookup selected, click Add Subtable. - Accept the default subtable name and click OK.
- In the subtable editor, click Populate or manually add rows for each digit.
- Map the source glyphs to their replacements:
zero→zero.onumone→one.onumtwo→two.onumthree→three.onumfour→four.onumfive→five.onumsix→six.onumseven→seven.onumeight→eight.onumnine→nine.onum
- Click OK to save the subtable, then click OK in the Font Info dialog to apply changes.
4. Test and Generate the Font
- Open the Metrics window by selecting Metrics > New Metrics Window.
- Type a string of numbers (e.g.,
1234567890). - Click the Features menu at the top of the Metrics window and check onum. The lining figures should instantly swap to your old-style figures.
- Navigate to File > Generate Fonts... to export your completed font as an OTF or TTF file with the functional OpenType feature intact.