OTFTOTFM(1)

NAME
otftotfm - create TeX font metrics from PostScript OpenType fonts

SYNOPSIS
otftotfm [-a] [options] otffile [fontname]

DESCRIPTION
Otftotfm creates TeX font metrics and a encoding file that correspond, as far as possible, to a PostScript-flavored OpenType font. The generated files are named fontname.vf, fontname.tfm, and so forth. They are written into the current directory, or, with the -a option, into a TeX Directory Structure.

OpenType fonts support a number of features. Turning on the "small capitals" feature, for example, replaces lower-case letter glyphs with the corresponding small capitals. Other features control the spacing of capital letters, whether numbers are lining or old-style, and so forth. (You can see what features a font supports using "otfinfo -f"; see Many simple features used for alphabetic scripts are supported by TeX, including:

*   Glyph substitutions, such as replacing 'a' with small caps 'A'.

*   Pair kerns, such as moving 'AV' closer together.

*   Ligatures, such as replacing 'f' and 'i' with an integrated 'fi' glyph.

*   Simple glyph positionings, such as adding extra space on either side of 'W'.

Otftotfm reads an OpenType font, turns on the font features you choose, and generates font metrics and a dvips encoding file that, together, implement those features as far as possible. By default otftotfm creates TFM and VF files using the and programs, but supply the --pl option and it will generate human-readable PL and VPL files.

  Common features

Even "default" ligatures and pair kerns are optional in OpenType fonts, so you'll generally provide the -fkern and -fliga options to turn them on. Other features you may be interested in include -fcpsp, for capital spacing; -fdlig, for optional ligatures; -flnum, -fonum, -fpnum, and -ftnum, to control digit glyphs; -fsmcp, for small capitals; -fswsh, for swash variants; and -fcswh, for contextual swash. See the OPENTYPE FEATURES section below for more information on these and other features.

  Automatic mode

Automatic mode, triggered by the -a/--automatic option, is the easiest way to use otftotfm. In automatic mode, otftotfm will install the font metrics and encoding files where TeX can find them, and additionally install a Type 1 font and mapping for dvips. This requires a TeX installation that follows the TeX Directory Structure standard (http://www.tug.org/tds/), such as most Unix TeX installations.

Simple instructions for web2c-based installations:

1.  Create a $HOME/texmf directory.

2.  Add a $HOME/texmf/dvips subdirectory to hold encodings and map files. Otftotfm will create and modify a file $HOME/texmf/dvips/lcdftools/lcdftools.map containing information about fonts it creates.

3.  Tell how to find the lcdftools.map file. The simplest way is to create a file $HOME/texmf/dvips/config.ps, containing the single line "p +lcdftools.map". You could also add this line to your ~/.dvipsrc or an existing config.ps, or create a script $HOME/texmf/dvips/updmap that does the right thing.

Now, after running "otftotfm -a file.otf fontname", you will immediately be able to refer to the font in TeX using the fontname you supplied to otftotfm. You will have to write .fd files and/or typescripts to make the font conveniently accessible from LaTeX or ConTeXt. See the DIAGNOSTICS section if you have problems with these instructions.

In automatic mode, otftotfm first searches your $TEXMF path for a writable directory. Often this will be your "$HOME/texmf" directory; you might want to create this directory now. It then installs files under that directory tree. Specifically, it places files in type-specific subdirectories, as follows:
File type | Directory | Filename
TFM | TEXMF/fonts/tfm/vendor/typeface/ | fontname[--base].tfm
VF | TEXMF/fonts/vf/vendor/typeface/ | fontname.vf
PL | TEXMF/fonts/pl/vendor/typeface/ | fontname[--base].pl
VPL | TEXMF/fonts/vpl/vendor/typeface/ | fontname.vpl
encoding | TEXMF/dvips/vendor/ | a_signature.enc
PFB font | TEXMF/fonts/type1/vendor/typeface/ | PSfontname.pfb
psfonts.map | TEXMF/dvips/vendor/ | vendor.map

"TEXMF" stands for the writable $TEXMF directory. Fontname is the font name supplied as otftotfm's second argument, and PSfontname is the PostScript name of the input font. The vendor and typeface strings are required by TDS; they default to "lcdftools" and the font's family name, respectively, but see the --vendor and --typeface options below. Signature is an opaque 6-character encoding signature.

You can override these directories with environment variables and options as follows. Options take precedence over environment variables.
File type | Environment variable | Option
TFM | TFMDESTDIR | --tfm-directory
VF | VFDESTDIR | --vf-directory
PL | PLDESTDIR | --pl-directory
VPL | VPLDESTDIR | --vpl-directory
encoding | ENCODINGDESTDIR | --encoding-directory
PFB font | T1DESTDIR | --type1-directory
psfonts.map | - | --map-file

Otftotfm will update the TEXMF/ls-R file when installing files under TEXMF. After changing a psfonts.map file, it also checks for an executable file called TEXMF/dvips/updmap; if found, this file is executed from the TEXMF/dvips directory.

OPTIONS
With long options, you need type only as many characters as will make the option unique.

  Font feature and transformation options
-s script[.lang], --script=script[.lang]
    Apply features suitable to the script system script and language system lang. Scripts and language systems are two-to-four-letter names assigned by Microsoft and Adobe. Examples include "latn" (Latin script), "grek" (Greek script), and "yi.YIC" (Yi script with classic characters). If lang is not specified, otftotfm will use the default language system for that script. You can give this option multiple times. Run "otfinfo -s font" to see the list of scripts and languages a font supports. Defaults to "latn".

-f feature, --feature=feature
    Activate the feature named feature. Features are four-letter names assigned by Microsoft and Adobe; they are meant to correspond to font behaviors, such as kerning or small-capitals. Examples include "liga" (default ligatures), "dlig" (discretionary ligatures), "kern" (kerning), and "c2sc" (replacing capitals with small capitals). Give this option multiple times to apply multiple features. Run "otfinfo -f [--script option] font" to see the list of features a font supports for a specified script. Defaults to any features required by the selected scripts.

-E amt, --extend=amt
    Widen, or extend, the font by a factor of amt. Like -e option.

-S amt, --slant=amt
    Oblique, or slant, the font by amt. Like -s option.

-L amt, --letterspacing=amt
    Letterspace each character by amt units, where 1000 units equals one em. The width of each character increases by amt, with half the space distributed to each sidebearing. Boundary-character kerns are added to maintain alignment at the ends of lines.

-k N, --min-kern=N
    Only output kerning pairs whose absolute value is N or larger. Smaller minimum kerns make kerning more precise and the output TFM file bigger. The default minimum kern is 2.0.

--design-size=size
    Set the output font's design size to size, a value in TeX points. This value is mostly just documentation, since LaTeX essentially ignores fonts' design sizes, but plain TeX may occasionally use the design size to decide how large a font should be. (Loading a font in TeX "at" a particular size effectively ignores the design size; loading a font plain or "scaled" by a given factor uses the design size.) The default is taken from the input font's optical size feature, or 10pt if it has no such feature.

  Encoding options
-e encoding, --encoding=encoding
    Selects the encoding used as a starting point. Otftotfm will search for encoding[.enc] the same way that dvips would, so you may not need to give a full pathname. Defaults to the font's encoding. See ENCODINGS, below, for more information on how otftotfm uses encodings.

--literal-encoding=encoding
    Selects the encoding used for the font. No glyph substitutions will be permitted, so the output encoding will equal the input encoding (and otftotfm will not generate an output encoding).

--ligkern=command
    Executes the specified LIGKERN command in addition to any in the encoding. See ENCODINGS, below, for more information on LIGKERN syntax. For example, "--ligkern 'T {L} h'" suppresses any T_h ligature in the font. You can supply multiple --ligkern options.

--unicoding=command
    Executes the specified UNICODING command in addition to any in the encoding. See ENCODINGS, below, for more information on UNICODINGs. For example, "--unicoding 'pi1 =: uni03D6'" tells otftotfm to encode "/pi1" as U+03D6 GREEK PI SYMBOL. You can supply multiple --unicoding options.

--coding-scheme=scheme
    Sets the font's TFM coding scheme to scheme, which must be a string less than 40 characters long containing no parentheses. The default is the encoding's PostScript name. Most tools ignore the coding scheme, so you probably don't need to worry about this command unless you are using fontinst.

--boundary-char=char
    Sets the font's boundary character to char, which should either be a single non-digit character, or a number between -1 and 255. The default is taken from the encoding.

--altselector-char=char
    Sets the font's alternate-selector character to char, which should either be a single non-digit character, or a number between -1 and 255. Use an alternate selector if you want to choose between different versions of a character from within a TeX file. For instance, say that your font provides three versions of "A". If you want to access them all, pick a character to be your alternate selector -- say "*". Then give otftotfm the --altselector-char='*' option. In TeX, "A" will produce the normal version, "A*" will produce the first alternate, and "A**" will produce the second alternate. Furthermore, "s*t" will activate any discretionary "s_t" ligature in the font. The default alternate-selector character is taken from the encoding.

    The --altselector-char mechanism uses the features specified by --altselector-feature options. You don't need to turn on those features if you use --altselector.

    See Sivan Toledo's article, cited in the See Also section, for more information.

--altselector-feature=feature
    Activates the feature named feature for the --altselector-char mechanism. Give this option multiple times to activate multiple features. This option activates features only for use with --altselector-char; use the --feature option to activate features globally. Defaults to the salt and dlig features.

--include-alternates=pattern
    Only include alternate characters whose names match pattern, which uses the glob matching rules common from filename matches (where "*" matches any number of characters, "?" matches any single character, and "[...]" matches any character in a set).

    OpenType fonts can have many alternates per character, most of which aren't interesting. For example, the character "a" in WarnockPro-Regular has five alternates, "ordfeminine", "Asmall", "asuperior", "a.end", and "orn.013". The --altselector-char option lets you cycle through these alternates, but it's better to leave out the ones you don't want, to avoid overfull encodings. Thus, if you were only interested in ".end" variants, you might run otftotfm with an --include-alternates='*.end' option.

--exclude-alternates=pattern
    Do not include alternate characters whose names match pattern, which uses the glob matching rules common from filename matches.

    You can give any number of --include- and --exclude-alternates options. Otftotfm will use an alternate if it matches at least one of the include patterns, and none of the exclude patterns. The patterns are applied to any feature introducing alternate characters, including "aalt" and "salt".

  Automatic mode options
-a, --automatic
    Select automatic mode.

-v vendor, --vendor=vendor
    Set the font vendor name, which is used to locate files within the TDS. Defaults to "lcdftools".

    In automatic mode, TeX and friends will generally find required font files independently of the vendor you select. However, you will need to explicitly tell to include vendor.map as a psfonts.map file, using a configuration line such as "p +vendor.map".

--typeface=typeface
    Set the font typeface name, which is used to locate files within the TDS. Defaults to the current font's family name with unsuiable characters removed.

--no-type1
    Do not use to create Type 1 fonts corresponding to the OpenType input fonts.

--no-dotlessj
    Do not use to create a special dotless-j font when the input font doesn't have dotless-j.

  Output options
-n fontname, --name=fontname
    Set the name of the output font, which is used in the psfonts.map line and, in automatic mode, to generate the output filename. The default is derived from the OpenType font's name and the features you selected.

-p, --pl
    Output human-readable PL and VPL metrics, not binary TFM and VF metrics. Note: Otftotfm's PL and VPL output files are legal, but the fontinst program may not accept them (it has a picky parser). Make sure to supply a --coding-scheme; if that doesn't help, run otftotfm's TFM output through

--no-virtual
    Do not generate virtual fonts (VFs and VPLs). Otftotfm will warn if the selected font features cannot be implemented without virtual fonts.

--no-encoding
    Do not generate an encoding file.

--no-map
    Do not generate a psfonts.map line for the font.

  File location options
--tfm-directory=dir
    The directory used for output TFM font metrics. Defaults to the TFMDESTDIR environment variable. If that's not set, it defaults to "." in manual mode, or a TDS directory in automatic mode (see above).

--pl-directory=dir
--vf-directory=dir
--vpl-directory=dir
--encoding-directory=dir
--type1-directory=dir
    These options act like --tfm-directory for other file types. The default environment variables are described above. All default to ".".

--map-file=filename
    Set file in which otftotfm will write a psfonts.map line for the font. The default is the standard output in manual mode, and "TEXMF/dvips/vendor.map" elsewhere.

  Miscellaneous options
--glyphlist=file
    Use file as the Adobe glyph list, which helps translate glyph names to Unicode code points. See ENCODINGS, below, for more information.

-V, --verbose
    Write progress messages to standard error.

--no-create
    Do not create or modify any files. Instead, write messages about the program's hypothetical progress to standard error.

-q, --quiet
    Do not generate any error messages.

--kpathsea-debug=flags
    Sets path searching debugging flags. See the Kpathsea manual for details.

-h, --help
    Print usage information and exit.

--version
    Print the version number and some short non-warranty information and exit.

ENCODINGS

  Commands

Otftotfm uses its input encodings by translating glyph names into Unicode code points. For example, if an input encoding has "/dotlessi" at position 10, then otftotfm detects that the user wants to encode Unicode character U+0131 LATIN SMALL LETTER DOTLESS I at position 10. The output encoding will use whatever glyph the font suggests for that code point, given the collection of features you chose.

You can control this process with "UNICODING" comments in the input encoding file. UNICODING comments have the following format:
  % UNICODING glyph =: choice1 [choice2 ...] ;
Glyph and the choices are PostScript glyph names. This comment tells otftotfm that the glyph named glyph translates into the first Unicode value in the choice list that has a character in the font. For example,
  % UNICODING pi1 =: uni03D6 ;
tells otftotfm that the character "/pi1" encodes as U+03D6 GREEK PI SYMBOL, and
  % UNICODING Delta =: uni0394 uni2206 ;
tells it that U+0394 GREEK CAPITAL LETTER DELTA should be preferred to U+2206 INCREMENT as an encoding for "/Delta". You can also supply regular glyph names:
  % UNICODING Delta =: Deltagreek Delta ;
Otftotfm uses Adobe's glyphlist.txt file to translate regular glyph names to Unicode; see http://partners.adobe.com/asn/developer/type/unicodegn.html.

You can also map a glyph to nothing to remove that glyph from the input encoding. This is useful to remove optional characters; for instance:
  % UNICODING ff =: ; fi =: ; fl =: ; ffi =: ; ffl =: ;
The f-ligatures will be added back to the encoding, preferably at their original locations, if some font feature requires them.

Map a glyph to 'emptyslot' if you don't want otftotfm to use the slot for a ligature character. For example, given this UNICODING,
 % UNICODING ff =: ff emptyslot ;
otftotfm will leave the 'ff' encoding slot unused if the font has no 'ff' glyph. (Note that most OpenType fonts provide a visible representation for unused encoding slots, namely a box with an X inside.)

Each UNICODING line can contain multiple commands, separated by spaced semicolons.

Ligatures can be added and kerns inhibited by LIGKERN comments in the encoding, as in To add a ligature, use this command form:
  % LIGKERN glyph1 glyph2 =: result ;
The "=:" operator indicates a normal ligature, where both the input glyphs are removed and replaced by result. To preserve the left-hand glyph, for an effect like "glyph1 glyph2 =: glyph1 result", use the "|=:" operator instead. You can also say "=:|" to preserve the right-hand glyph. Otftotfm does not yet support the other five ligature operators ("|=:|", "|=:>", "=:|>", "|=:|>", and "|=:|>>").

To remove all kerns between two characters, say:
  % LIGKERN glyph1 {} glyph2 ;
Use a star "*" for one glyph to inhibit all matching kerns. For instance,
  % LIGKERN a {} * ;
removes all kerns with "a" as the left-hand character, and
  % LIGKERN * {} * ;
removes all kerns.

Otftotfm also supports extended syntax for inhibiting ligatures via LIGKERNX commands. This:
  % LIGKERNX glyph1 {L} glyph2 ;
inhibits any ligature between glyph1 and glyph2. "{K}", like "{}", inhibits kerns only, and "{LK}" and "{KL}" inhibit both ligatures and kerns.

You can set the --boundary-char and --altselector-char from an encoding file with commands like this:
  % LIGKERN || = boundarychar ;
  % LIGKERNX ^^ = altselectorchar ;
As with UNICODING, each LIGKERN or LIGKERNX line can contain multiple commands, separated by spaced semicolons.

The --unicoding and --ligkern command line arguments let you add virtual UNICODING and LIGKERN comments to an encoding.

Finally, the CODINGSCHEME command specifies a default --coding-scheme for the encoding; for example:
  % CODINGSCHEME EXTENDED TEX FONT ENCODING

If the encoding file had no commands, and you gave no --ligkern options, otftotfm adds eight default ligatures:
  space l =: lslash ; space L =: Lslash ;
  question quoteleft =: questiondown ; exclam quoteleft =: exclamdown ;
  hyphen hyphen =: endash ; endash hyphen =: emdash ;
  quoteleft quoteleft =: quotedblleft ;
  quoteright quoteright =: quotedblright

  New glyphs

New glyphs, such as ligatures and contextual substitutions, are added to the encoding in any empty spaces, using their original locations when possible. If the encoding doesn't have enough space for all new glyphs, shorter ligatures composed of unaccented letters get precedence.

  Synthetic glyphs

Otftotfm can synthesize some glyphs using virtual font manipulations, if a required glyph is not available in the input font. Specifically, it will synthesize "IJ", "ij", "Germandbls" (a capital "sharp-s", namely "SS"), "cwm" (the TeX T1 encoding's compound word mark), and "visualspace" (the TeX T1 encoding's visible space).

OPENTYPE FEATURES

This section lists features common to Western OpenType fonts and describes how otftotfm handles them for common fonts. Please send the author mail if otftotfm does not handle a feature you need, or you believe it handles some feature incorrectly.

aalt, Access All Alternates
    Lets the user choose between all available alternate forms for a character. This includes things like superscript and subscript variants, as well as different styles (swash, for example). The --altselector-char mechanism can provide useful access to this feature if you supply --altselector-feature=aalt. See also salt and calt.
c2sc, Small Capitals From Capitals
    Replaces capital letters with small capitals: a sort of converse of the more conventional smcp feature, which replaces lower-case letters with small capitals. Supported.
calt, Contextual Alternates
    Lets the user choose between context-appropriate swash forms for each character. For example, given the word "DREW" in a cursive typeface, the "R E W" might be translated to calmer forms than the initial "D". There may be more than one choice for a given letter, in which case the user should be able to select among them. TeX can't support complex contextual alternates, or alternate selection, but otftotfm supports some fonts quite well. The input encoding should have lots of empty space for variants, and it should specify a boundary character. See also cswh.
case, Case-Sensitive Forms
    Shifts punctuation marks up to a position that works well with all-capital-letter sequences. For example, the hyphen character, which generally centers vertically on the x-height, is raised up to center vertically on a capital letter. Also replaces text figures with lining figures, and accent marks with forms more appropriate for capitals. Supported.
cpsp, Capital Spacing
    Adds a bit of space on either side of each capital letter. Supported. (However, the OpenType tag registry suggests that cpsp be on by default, but applying to all-caps text only; TeX cannot easily implement that contextual intelligence.)
cswh, Contextual Swash
    Lets the user choose between context-appropriate swash forms for each character. For example, in the words "Ab AC", the first "A" might be translated to a swash form, while the second might not. There may be more than one choice for a given letter, in which case the user should be able to select among them. TeX can't support complex contextual swashes, or alternate selection, but otftotfm supports some fonts quite well. The input encoding should have lots of empty space for swash variants, and it should specify a boundary character. See also calt.
dlig, Discretionary Ligatures
    Activates uncommon ligatures, such as "c_t", "s_p", and "s_t". Supported.
dnom, Denominators
    Replaces digits and some punctuation marks with smaller forms sitting on the baseline, intended for fraction denominators. Supported.
fina, Terminal Forms
    Substitutes appropriate forms for letters occurring at the ends of words. This feature doesn't select swash variants; it's intended for normal use, and the specification recommends that it be on by default. Partially supported: TeX will only treat spaces as the ends of words, where a correct implementation would probably include punctuation too. See cswh for selecting swash variants active at the ends of words.
frac, Fractions
    Replaces simple sequences like "1/2" with nice-looking fractions. Supported, but beware: many fonts will translate "11/32" into "1" + "1/3" + "2".
hist, Historical Forms
    Replaces characters with historical variants. Usually, this means at least translating regular "s" to long "s". Supported.
kern, Kerning
    Adjusts the space between characters (pair kerning). Generally supported, and you should probably turn it on.
liga, Standard Ligatures
    Activates common ligatures, such as "f_f", "f_i", "f_f_j", and (in some Adobe fonts) "T_h". Generally supported, and you should probably turn it on.
lnum, Lining Figures
    Uses lining figures, the set of digits that are all about as high as capital letters. Supported. Compare onum; see also pnum and tnum.
numr, Numerators
    Replaces digits and some punctuation marks with smaller, raised forms intended for fraction numerators. Supported, but not usually useful.
onum, Oldstyle Figures
    Uses old-style figures, also known as text figures. This is the set of digits that have ascenders and descenders like lower-case letters. Supported. Compare lnum; see also pnum and tnum.
ordn, Ordinals
    Designed for Spanish and French. Replaces ordinal numbers, such as "2.o", with forms where the "o" is raised, and replaces the sequence "No" with an integrated glyph. Supported.
ornm, Ornaments
    Replaces some alphabetic characters in the font with ornaments, and links the bullet character to a set of all bullet-like ornaments, from which the user can choose. Partially supported: TeX can handle alphabetic substitutions, but not bullet choice.
pnum, Proportional Figures
    Digits will have different widths. Supported. Compare tnum; see also lnum and onum.
salt, Stylistic Alternates
    Lets the user choose between stylistic alternate forms for a character. The --altselector-char mechanism provides useful access to this feature. If you turn on salt globally, otftotfm takes the first alternate form whenever there's more than one choice. See also aalt and ss01; salt is generally more useful than aalt for TeX, since it refers exclusively to stylistic alternates.
sinf, Scientific Inferiors
    Replaces digits and some punctuation marks with smaller, lowered forms intended for subscripts. Supported.
size, Optical Size
    This feature stores information about the range of optical sizes for which the font was intended. There is no point in selecting it with otftotfm, since it should not change the font's appearance in any way.
smcp, Small Capitals
    Replaces lower-case letters with small capitals. Supported. Compare c2sc.
ss01-ss20, Stylistic Sets 1-20
    Replaces characters with a uniform set of stylistic alternates. Differs from features like salt in that a Stylistic Set is uniform: an ssXX feature should never involve selection from a set of possible alternate characters. Supported.
sups, Superscript
    Replaces digits, some punctuation marks, and some lower-case letters with smaller, raised forms intended for superscripts. Supported.
swsh, Swash
    Activates all swash forms for each character. There may be more than one swash form, in which case otftotfm will pick the first one listed. Supported, except that swash variants other than the first are inaccessible.
tnum, Tabular Figures
    All digits will have the same width, so that tables and the like will align visually. Supported. Compare pnum; see also lnum and onum.
zero, Slashed Zero
    Replaces the zero character with a slashed zero. Supported.

DIAGNOSTICS AND TROUBLESHOOTING

no writable directory found in $TEXMF
    Otftotfm could not find a writable directory in your $TEXMF path. Did you create a $HOME/texmf directory? If so, run the command "kpsewhich --expand-path='$TEXMF'" to verify that directory is not being found. You may need to set your TEXMF environment variable, to '{!!'"$HOME"'/texmf,!!$TEXMFMAIN}', for instance (note the different kinds of quotes; on my machine, this expands to '{!!/home/kohler/texmf,!!$TEXMFMAIN}').

'char' has no encoding, ignoring kern removal
(or ligature removal, lig/kern removal, or ligature)
    These messages indicate a slight problem with your encoding file: one of the LIGKERN commands referred to a character not present in the encoding. This might be due to a misspelling in the LIGKERN command or the encoding file, or it might be an oversight. Either fix the encoding file or ignore the warning.

can't map 'char' to Unicode
    Another encoding file problem: One of the glyph names in an UNICODING block could not be converted to Unicode. This is problematic since UNICODING exists wholly to translate glyph names into Unicode. Fix the encoding file or ignore the warning.

ignoring unencodable glyph(s) ...
    There wasn't space in the encoding for all the glyphs referred to by the features you selected. For example, maybe the font had more ligatures than there were empty slots in the encoding. Fix this warning by selecting fewer features, or by using an encoding with more empty slots, such as the 7t.enc encoding distributed with otftotfm.

BUGS

Presumably some context-sensitive positionings and ligatures could be implemented with TeX's boundary character, but otftotfm doesn't do that yet.

See the documentation for --pl above if you have problems running otftotfm's output through fontinst.

SEE ALSO

Adobe Type 1 Font Format

Adobe Technical Notes #5176, The Compact Font Format Specification, and #5177, The Type 2 Charstring Format

OpenType Specification, Version 1.4

A Directory Structure for TeX Files, http://www.tug.org/tds/

Kpathsea: A library for path searching, http://www.tug.org/kpathsea/

Sivan Toledo, Exploiting Rich Fonts, TUGboat 21(2), 2000, http://www.tug.org/TUGboat/Articles/tb21-2/tb67tole.pdf

AUTHOR
Eddie Kohler (kohler@icir.org)

Thanks to Karl Berry, Marco Kuhlmann, Adam Lindsay, Bruce D'Arcus, and Claire Connelly for suggestions, bug reports, and help.