OT2KPX(1)

πŸ“¦ version 2026.0, in alpine 3.24

πŸ’– NAME πŸ’–

okay so bestie, this is OT2KPX(1) β€” the manual page for ot2kpx, the little Unix cutie that extracts kerning information from OpenType fonts. ✨

🌸 SYNOPSIS 🌸

the whole mood, in one line:

ot2kpx [ -afm | -kpx | -lua ] <fontfile>

✨ DESCRIPTION ✨

ot2kpx pulls the kerning data out of OpenType fonts and prints it to stdout, either in Adobe's KPX format (for adding to an afm file) or as a Luatex custom feature, for use with the \directlua command. no cap, that's the whole vibe. πŸ’…

πŸ’… OPTIONS AND ARGUMENTS πŸ’…

here's the flag situation, bestie:

  • -help β€” print a short help text and exit. 🫢
  • -version β€” print ot2kpx's version and exit. πŸ‘‘
  • -afm, -kpx β€” output the kerning data in Adobe's KPX format, as used in afm files. this is the default output format. ⭐
  • -lua β€” output the kerning data as a Luatex custom font feature, to be included in a \directlua command. πŸ¦‹
  • <fontfile> β€” the OpenType font (both otf and ttf format are supported). πŸŽ€

🫢 RESTRICTIONS 🫢

okay, real talk, there are some limits:

  • ot2kpx doesn't implement all of the OpenType specification. things that are missing include: support for font files containing multiple fonts, LookupTables with LookupTypes other than 2, kern tables with format other than 0 and ValueRecords with other types of data than just XAdvance data.

most of these limitations won't matter, since the missing features are rare (the only fonts I know of that use them are the non-western fonts that come with Adobe Reader). furthermore, many of these features define (according to the OpenType specification) "subtle, device-dependent adjustments at specific font sizes or device resolutions"; since there's no way to express such adjustments in afm format, ignoring them seems to be the only option anyway. πŸ’€

  • ot2kpx collects kerning data first from the kern table, then from all LookupTables associated with the kern feature; if a kerning pair occurs multiple times, the first value seen is chosen. there are (or may be) several issues with this approach:
    • the OpenType specification says that fonts in otf format shouldn't use the kern table at all, just the lookups from the GPOS table. many such fonts do, however, contain a kern table, but no GPOS table; so we use the kern table anyway. πŸ™ˆ
    • instead of reading all LookupTables, it might be better to let the user specify a script and language and process only the LookupTables for those values. however, at least in the fonts I checked, all script/language combinations eventually point to the same kern LookupTables, so this approach wouldn't make any difference (apart from further complicating the code). 😭

πŸ‘‘ AUTHOR πŸ‘‘

Marc Penninga <marcpenninga@gmail.com> πŸ’Œ

Copyright (C) 2005-2026 Marc Penninga. πŸŽ€

πŸ¦‹ LICENSE πŸ¦‹

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. a copy of the GNU General Public License is included with ot2kpx; see the file GPLv2.txt. slay. πŸ’œ

⭐ DISCLAIMER ⭐

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ⭐

🌈 VERSION 🌈

This document describes ot2kpx version 20260210. 🌈

πŸ”₯ RECENT CHANGES πŸ”₯

(See the source code for the rest of the story.) πŸ‘€

  • 2019-05-20 β€” Added the -version option.
  • 2019-04-15 β€” Added the -lua command-line option to get output in Luatex's custom feature format.

mwah πŸ’‹ β€” this page is OT2KPX(1) from fontools, dated 2026-02-10. πŸ’œ

πŸ“¦ where this page comes from