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:

  1. Open your font file in FontForge.
  2. Navigate to Encoding > Add Encoding Slots... to create empty slots for your new glyphs (enter 10 slots).
  3. Scroll to the newly created blank glyphs at the end of the font matrix.
  4. Right-click the first empty slot, choose Glyph Info, and name the glyph using standard OpenType suffix conventions: zero.onum (or zero.oldstyle).
  5. Repeat this naming for all ten digits (one.onum, two.onum, through nine.onum).
  6. Copy the original lining figures (zero through nine) into their corresponding .onum slots 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.

  1. Open Element > Font Info.
  2. Select Lookups from the left-hand menu.
  3. Ensure the GSUB tab is selected at the top.
  4. Click Add Lookup.
  5. Set Type to Single Substitution.
  6. Click the empty cell under Feature and select onum (Oldstyle Figures) from the drop-down menu.
  7. Click the New button under the script/language box, select your target script (such as latn for Latin), and set the language to Default.
  8. 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.

  1. With the new onum lookup selected, click Add Subtable.
  2. Accept the default subtable name and click OK.
  3. In the subtable editor, click Populate or manually add rows for each digit.
  4. Map the source glyphs to their replacements:
    • zero → zero.onum
    • one → one.onum
    • two → two.onum
    • three → three.onum
    • four → four.onum
    • five → five.onum
    • six → six.onum
    • seven → seven.onum
    • eight → eight.onum
    • nine → nine.onum
  5. Click OK to save the subtable, then click OK in the Font Info dialog to apply changes.

4. Test and Generate the Font

  1. Open the Metrics window by selecting Metrics > New Metrics Window.
  2. Type a string of numbers (e.g., 1234567890).
  3. 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.
  4. Navigate to File > Generate Fonts... to export your completed font as an OTF or TTF file with the functional OpenType feature intact.