OpenType Layout feature classification
OpenType Layout features drive the correct display of complex scripts like Arabic and Indic, and they let users apply advanced typographic formatting. This is a classification of the registered feature tags, written for developers building UI to expose them.
OpenType Layout features live in the GSUB and GPOS tables of an SFNT font. They cover two jobs at once: making complex scripts render correctly, and giving readers and designers control over typographic niceties like ligatures, small caps, and figure styles.
This classification was built on the OpenType spec version 1.6, with extra entries for removed features and the Microsoft-only Math features tied to the MATH table. It is a 2013 snapshot — the registry has changed since, and a few tags listed here have shifted status — so treat it as a design reference rather than a normative source. It is aimed squarely at developers who want to build a sensible UI for applying these features.
The feature table¶
The table classifies each tag along several axes: which spec it comes from, whether and how it should appear in a UI, the text level it applies at, the scripts it serves, where it sits relative to shaping, whether it is on by default, and a loose functional grouping.
| Tag | Friendly name | Spec | Access | Show in UI | UI level | Script | Script-specific | Default | Group | Subgroup |
|---|---|---|---|---|---|---|---|---|---|---|
aalt |
Access All Alternates | OpenType | opt-in | special | character, word | ALL | outside | never | Typography | variants |
abvf |
Above-Base Forms | OpenType | mandatory | no | none | khmr | during | shaping | Language | complex scripts |
abvm |
Above-Base Mark Positioning | OpenType | mandatory | no | none | INDIC, khmr | after | shaping | Language | complex scripts |
abvs |
Above-Base Substitutions | OpenType | mandatory | no | none | INDIC, khmr | during | shaping | Language | complex scripts |
afrc |
Alternative Fractions | OpenType | opt-in | yes | character, word | ALL | after | never | Typography | numerals and scientific |
akhn |
Akhands | OpenType | mandatory | no | none | INDIC | during | shaping | Language | complex scripts |
altv |
Alternate Vertical Metrics | Removed | never | no | none | NONE | none | never | Removed | none |
blwf |
Below-Base Forms | OpenType | mandatory | no | none | INDIC, khmr | during | shaping | Language | complex scripts |
blwm |
Below-Base Mark Positioning | OpenType | mandatory | no | none | INDIC, khmr | after | shaping | Language | complex scripts |
blws |
Below-Base Substitutions | OpenType | mandatory | no | none | INDIC, khmr | during | shaping | Language | complex scripts |
c2pc |
Petite Capitals From Capitals | OpenType | opt-in | yes | word, paragraph | ALL | after | never | Typography | letter case |
c2sc |
Small Capitals From Capitals | OpenType | opt-in | yes | word, paragraph | ALL | after | never | Typography | letter case |
calt |
Contextual Alternates | OpenType | opt-out | yes | word, paragraph | ALL, (except) hani | after | always | Typography | basic support |
case |
Case-Sensitive Forms | OpenType | opt-in | yes | word, paragraph | ALL | after | never | Typography | letter case |
ccmp |
Glyph Composition/Decomposition | OpenType | mandatory | no | none | ALL | before | always | Language | basic support |
cfar |
Conjunct Form After Ro | OpenType | mandatory | no | none | khmr | during | shaping | Language | complex scripts |
cjct |
Conjunct Forms | OpenType | mandatory | no | none | ALL | during | shaping | Language | complex scripts |
clig |
Contextual Ligatures | OpenType | opt-out | yes | word, paragraph | ALL | after | always | Typography | basic support |
cpsp |
Capital Spacing | OpenType | opt-in | yes | word, paragraph | ALL | after | never | Typography | letter case |
crcy |
Currency | Removed | never | no | none | NONE | none | never | Removed | none |
cswh |
Contextual Swash | OpenType | opt-in | yes | word, paragraph | ALL | after | never | Typography | variants |
curs |
Cursive Positioning | OpenType | mandatory | no | none | ALL | after | always | Language | complex scripts |
cv[01-99] |
Character Variant [01-99] | OpenType | opt-in | yes | special | ALL | after | never | Typography | variants |
dflt |
Default Processing | Removed | never | no | none | NONE | none | never | Removed | none |
dist |
Distances | OpenType | mandatory | no | none | INDIC, khmr | after | shaping | Language | complex scripts |
dlig |
Discretionary Ligatures | OpenType | opt-in | yes | word, paragraph | ALL | after | never | Typography | variants |
dnom |
Denominators | OpenType | opt-in | yes | character, word | ALL | after | never | Typography | numerals and scientific |
dpng |
Diphthongs | Removed | never | no | none | NONE | none | never | Removed | none |
dtls |
Dotless Forms | Math | mandatory | no | math | math | during | shaping | Typography | numerals and scientific |
expt |
Expert Forms | OpenType | opt-in | yes | word, paragraph | hani, kana | after | maybe | Typography | Asian CJK |
falt |
Final Glyph Alternates | OpenType | opt-in | yes | paragraph, document | CURSIVE, syrc | after | never | Typography | complex scripts |
fin2 |
Terminal Forms #2 | OpenType | mandatory | no | none | syrc | during | shaping | Language | complex scripts |
fin3 |
Terminal Forms #3 | OpenType | mandatory | no | none | syrc | during | shaping | Language | complex scripts |
fina |
Terminal Forms | OpenType | special | special | none | word, paragraph* | ARABIC, syrc | ALL | during | shaping | Language | complex scripts |
flac |
Flattened Accents over Capitals | Math | mandatory | no | math | math | during | shaping | Typography | numerals and scientific |
frac |
Fractions | OpenType | opt-in | yes | character, word | ALL | after | never | Typography | numerals and scientific |
fwid |
Full Width | OpenType | opt-in | yes | word, paragraph | hani, kana | after | never | Typography | Asian CJK |
half |
Half Forms | OpenType | mandatory | no | none | INDIC | during | shaping | Language | complex scripts |
haln |
Halant Forms | OpenType | mandatory | no | none | INDIC | during | shaping | Language | complex scripts |
halt |
Alternate Half Width | OpenType | opt-in | yes | paragraph, document | hani, kana | after | never | Typography | Asian CJK |
hist |
Historical Forms | OpenType | opt-in | yes | character, word | ALL | after | never | Typography | variants |
hkna |
Horizontal Kana Alternates | OpenType | special | special | orientation | kana | after | orientation | Language | Asian CJK |
hlig |
Historical Ligatures | OpenType | opt-in | yes | character, word | ALL | after | never | Typography | variants |
hngl |
Hangul | OpenType | opt-in | yes | character, word | hang, hani | after | never | Language | Asian CJK |
hojo |
Hojo Kanji Forms (JIS X 212-1990) | OpenType | opt-in | yes | word, paragraph | hani, kana | after | never | Typography | Asian CJK |
hwid |
Half Width | OpenType | opt-in | yes | word, paragraph | hani, kana | after | never | Typography | Asian CJK |
init |
Initial Forms | OpenType | special | special | none | word, paragraph* | ARABIC, syrc | ALL | during | shaping | Language | complex scripts |
isol |
Isolated Forms | OpenType | special | special | none | word, paragraph* | ARABIC, syrc | ALL | during | shaping | Language | complex scripts |
ital |
Italics | OpenType | opt-in | yes | word, paragraph | latn, cyrl, grek | after | never | Typography | Asian CJK |
jajp |
Japanese Forms | Removed | never | no | none | NONE | none | never | Removed | none |
jalt |
Justification Alternatives | OpenType | opt-in | yes | paragraph, document | ALL | after | never | Typography | basic support |
jp03 |
JIS03 Forms | Removed | never | no | none | NONE | none | never | Removed | none |
jp04 |
JIS2004 Forms | OpenType | opt-in | yes | character, word | hani, kana | after | never | Language | Asian CJK |
jp78 |
JIS78 Forms | OpenType | opt-in | yes | character, word | hani, kana | after | never | Language | Asian CJK |
jp83 |
JIS83 Forms | OpenType | opt-in | yes | character, word | hani, kana | after | never | Language | Asian CJK |
jp90 |
JIS90 Forms | OpenType | opt-in | yes | character, word | hani, kana | after | never | Language | Asian CJK |
kern |
Kerning | OpenType | mandatory | no | document | ALL | after | always | Typography | basic support |
kokr |
Korean Forms | Removed | never | no | none | NONE | none | never | Removed | none |
lfbd |
Left Bounds | OpenType | mandatory | no | document | ALL | after | always | Typography | basic support |
liga |
Standard Ligatures | OpenType | opt-out | yes | word, paragraph | ALL | after | always | Typography | basic support |
ljmo |
Leading Jamo Forms | OpenType | mandatory | no | none | hang, jamo | during | shaping | Language | Asian CJK |
lnum |
Lining Figures | OpenType | opt-in | yes | character, word | ALL | after | never | Typography | numerals and scientific |
locl |
Localized Forms | OpenType | mandatory | special | language selection | ALL | before | always | Language | basic support |
ltra |
Left-to-right alternates | OpenType | mandatory | no | none | RTL | before | bidi | Language | complex scripts |
ltrm |
Left-to-right mirrored forms | OpenType | mandatory | no | none | RTL | before | bidi | Language | complex scripts |
mark |
Mark Positioning | OpenType | mandatory | no | none | ALL | after | always | Language | basic support |
med2 |
Medial Forms #2 | OpenType | mandatory | no | none | syrc | during | always | Language | complex scripts |
medi |
Medial Forms | OpenType | special | special | none | word, paragraph* | ARABIC, syrc | ALL | during | shaping | Language | complex scripts |
mgrk |
Mathematical Greek | OpenType | opt-in | yes | character, word | grek | after | never | Typography | numerals and scientific |
mkmk |
Mark to Mark Positioning | OpenType | mandatory | no | none | ALL | after | always | Language | basic support |
mset |
Mark Positioning via Substitution | OpenType | mandatory | no | none | ALL | after | always | Language | basic support |
nalt |
Alternate Annotation Forms | OpenType | opt-in | yes | character, word | hani, kana, latn, cyrl, grek | after | never | Typography | Asian CJK |
nlck |
NLC Kanji Forms | OpenType | opt-in | yes | character, word | hani, kana | after | never | Language | Asian CJK |
nukt |
Nukta Forms | OpenType | mandatory | no | none | INDIC | during | shaping | Language | complex scripts |
numr |
Numerators | OpenType | opt-in | yes | character, word | ALL | after | never | Typography | numerals and scientific |
onum |
Old Style Figures | OpenType | opt-in | yes | word, paragraph | ALL | after | never | Typography | numerals and scientific |
opbd |
Optical Bounds | OpenType | mandatory | special | document | ALL | after | always | Typography | basic support |
ordn |
Ordinals | OpenType | opt-in | yes | character, word | ALL | after | never | Typography | basic support |
ornm |
Ornaments | OpenType | opt-in | yes | character, word | ALL | after | never | Typography | variants |
palt |
Proportional Alternate Width | OpenType | opt-in | yes | word, paragraph | hani, kana, latn, cyrl, grek | after | never | Typography | Asian CJK |
pcap |
Petite Capitals | OpenType | opt-in | yes | word, paragraph | ALL | after | never | Typography | letter case |
pkna |
Proportional Kana | OpenType | opt-in | yes | word, paragraph | kana | after | never | Typography | Asian CJK |
pnum |
Proportional Figures | OpenType | opt-in | yes | word, paragraph | ALL | after | never | Typography | numerals and scientific |
pref |
Pre-base Forms | OpenType | mandatory | no | none | INDIC, khmr | during | shaping | Language | complex scripts |
pres |
Pre-base Substitutions | OpenType | mandatory | no | none | INDIC, khmr | during | shaping | Language | complex scripts |
pstf |
Post-base Forms | OpenType | mandatory | no | none | INDIC, khmr | during | shaping | Language | complex scripts |
psts |
Post-base Substitutions | OpenType | mandatory | no | none | INDIC, khmr | during | shaping | Language | complex scripts |
pwid |
Proportional Widths | OpenType | opt-in | yes | word, paragraph | hani, kana, latn, cyrl, grek | after | never | Typography | Asian CJK |
qwid |
Quarter Widths | OpenType | opt-in | yes | word, paragraph | hani, kana | after | never | Typography | Asian CJK |
rand |
Randomize | OpenType | opt-in | yes | word, paragraph | ALL | after | never | Typography | variants |
rclt |
Required Contextual Forms | Proposed | opt-out | no | none | ALL | after? | always | Typography | basic support |
rkrf |
Rakar Forms | OpenType | mandatory | no | none | INDIC | during | shaping | Language | complex scripts |
rlig |
Required Ligatures | OpenType | mandatory | no | none | ALL | during | always | Language | basic support |
rphf |
Reph Form | OpenType | mandatory | no | none | INDIC | during | shaping | Language | complex scripts |
rtbd |
Right Bounds | OpenType | mandatory | no | document | ALL | after | always | Typography | basic support |
rtla |
Right-To-Left Alternates | OpenType | mandatory | no | none | RTL | before | shaping | Language | complex scripts |
ruby |
Ruby Notation Forms | OpenType | opt-in | yes | word, paragraph | hani, kana | after | never | Typography | Asian CJK |
salt |
Stylistic Alternates | OpenType | opt-in | yes | word, paragraph | ALL | after | never | Typography | variants |
sinf |
Scientific Inferiors | OpenType | opt-in | yes | character, word | ALL | after | never | Typography | numerals and scientific |
size |
Optical Size | OpenType | mandatory | special | document | ALL | before | always | Typography | basic support |
smcp |
Small Capitals | OpenType | opt-in | yes | word, paragraph | ALL | after | never | Typography | letter case |
smpl |
Simplified Forms | OpenType | opt-in | yes | document | hani, kana | after | never | Language | Asian CJK |
ss[01-20] |
Stylistic Set [01-20] | OpenType | opt-in | yes | word, paragraph | ALL | after | never | Typography | variants |
ssty |
Script Style | Math | mandatory | no | math | math | during | shaping | Typography | numerals and scientific |
subs |
Subscript | OpenType | opt-in | yes | character, word | ALL | after | never | Typography | numerals and scientific |
sups |
Superscript | OpenType | opt-in | yes | character, word | ALL | after | never | Typography | numerals and scientific |
swsh |
Swash | OpenType | opt-in | yes | character, word | ALL | after | never | Typography | variants |
titl |
Titling | OpenType | opt-in | yes | word, paragraph | ALL | after | never | Typography | variants |
tjmo |
Trailing Jamo Forms | OpenType | mandatory | no | none | hang, jamo | during | shaping | Language | Asian CJK |
tnam |
Traditional Name Forms | OpenType | opt-in | yes | document | hani, kana | after | never | Language | Asian CJK |
tnum |
Tabular Figures | OpenType | opt-in | yes | word, paragraph | ALL | after | never | Typography | numerals and scientific |
trad |
Traditional Forms | OpenType | opt-in | yes | document | hani, kana | after | never | Language | Asian CJK |
twid |
Third Widths | OpenType | opt-in | yes | word, paragraph | hani, kana | after | never | Typography | Asian CJK |
unic |
Unicase | OpenType | opt-in | yes | word, paragraph | ALL | after | never | Typography | letter case |
valt |
Alternate Vertical Metrics | OpenType | special | special | orientation | hani, kana | after | orientation | Typography | Asian CJK |
vatu |
Vattu Variants | OpenType | mandatory | no | none | INDIC | during | shaping | Language | complex scripts |
vert |
Vertical Writing | OpenType | special | special | orientation | hani, kana | after | orientation | Typography | Asian CJK |
vhal |
Alternate Vertical Half Metrics | OpenType | opt-in | yes | word, paragraph | hani, kana | after | never | Typography | Asian CJK |
vivn |
Vietnamese Forms | Removed | never | no | none | NONE | none | never | Removed | none |
vjmo |
Vowel Jamo Forms | OpenType | mandatory | no | none | hang, jamo | during | shaping | Language | Asian CJK |
vkna |
Vertical Kana Alternates | OpenType | special | special | orientation | kana | after | orientation | Typography | Asian CJK |
vkrn |
Vertical Kerning | OpenType | special | special | orientation | hani, kana | after | orientation | Typography | Asian CJK |
vpal |
Proportional Alternate Vertical Metrics | OpenType | opt-in | yes | word, paragraph | hani, kana | after | never | Typography | Asian CJK |
vrt2 |
Vertical Rotation | OpenType | special | special | orientation | hani, kana | after | orientation | Typography | Asian CJK |
zero |
Slashed Zero | OpenType | opt-in | yes | word, paragraph | ALL | after | never | Typography | numerals and scientific |
zhcn |
Simplified Chinese Forms | Removed | never | no | none | NONE | none | never | Removed | none |
zntw |
Traditional Chinese Forms | Removed | never | no | none | NONE | none | never | Removed | none |
A few tags carry notes: fina, init, isol, and medi are marked “special” because they only need UI where shaping does not already require them. rclt was a proposed feature (August 2012) at the time of writing.
How to read the columns¶
Spec. Where the tag comes from: OpenType, Math (Microsoft-only, tied to the MATH table), or Removed.
Tag. The four-letter OpenType feature tag. Numbered families are written as ranges: cv[01-99] covers cv01 through cv99, and ss[01-20] covers ss01 through ss20.
Friendly name. The official feature name as registered in the specification.
Show in UI. One of no, yes, or special. “No” means no UI is needed; “yes” means the app should expose a control directly tied to the feature; “special” means the feature is better tied to a general application or document preference (for example optical bounds, or CJK orientation) than to a per-run toggle.
UI level. Where a control belongs: none, character, word, paragraph, or document. Some features make sense on a single character or two; others apply to long runs of text.
Script. A generalization of which features serve which scripts: ALL, INDIC, RTL, ARABIC, CURSIVE, NONE, or specific four-letter script tags. This is not exact — the spec sometimes uses loose wording like “Indic scripts similar to Devanagari” — so the column mixes concrete script tags with generic groupings. A worthwhile follow-up would be an exhaustive mapping of every registered feature to every registered script tag, grouped by family (European, Indic, Arabetic, CJK) and writing direction (LTR, RTL, vertical).
Script-specific shaping. When a feature is applied relative to shaping: before, during, after, or outside. Only four features land cleanly in “before”: ccmp, locl, rtla, and size. Adobe describes its CJK features differently from Microsoft — Microsoft documents them as a shaping specification, Adobe spreads the behavior across individual feature descriptions — so all of Adobe’s CJK features are classified here as “applied after shaping,” since shaping is not formally defined in that context.
Applied by default. Whether the feature is on by default: never, shaping, always, maybe, or (for CJK) orientation-driven.
Functional category. A loose grouping into Language, Typography, or Removed. The split between “language” (needed for correct rendering) and “typography” (optional refinement) already exists in the script-specific specs.
Functional subcategory. A finer grouping useful for organizing UI: Asian CJK, complex scripts, basic support, numerals and scientific, letter case, or variants.