Fonts/Ligatures
Contents
Introduction
Ligatures are combinations of letters that use different glyph shapes to avoid clashing of parts like i-dots and f-arcs. Many fonts contain at least fi and fl ligatures, well-furnished fonts have also ft, ffl, ffi, fft, fb, ffb, fh, ffh and maybe some traditional ones like st, sp, ct, ch and combinations with long s – German ß was originally a long-s + end-s ligature (even if it looks like s+z and is called szlig).
While the use of ligatures is a feature of good typography, there are places where they don’t belong, namely at syllable seams where hyphenation can or should take place.
Some typical German examples are Auf-lage, auf-laden, auf-fallen, Zupf-instrument, Schiff-fahrt. English examples would be chief-ly, shelf-ful, elf-like, wolf-trap, clothes-pin.
Traditional TeX methods to break ligatures
- Auf\/lage – breaks the ligature, but also kills hyphenation and kerning
- Auf{}lage – worked in pdfTeX (MkII), but not in modern TeX engines
- For LaTeX, there’s the selnolig package (English and German).
Enabling Ligatures in fonts
Ligatures in OpenType fonts are defined via "features" that you can/must enable. Usual ligature features are liga and tlig, but some fonts my have others for more/exotic ligatures. Here’s an example for a good set of default features:
\definefontfeature[default] [mode=node,kern=yes, liga=yes,tlig=yes, ccmp=yes,language=dflt, protrusion=quality, expansion=quality]
The other way round – if you don’t enable ligatures in your font features, you won’t get any; this might be desirable for mono width (typewriter) fonts.
Single places
If you only want to fix a few occurrences, you can use \noligature. Compare:
Auflage Zupfinstrument Au\noligature{fl}age Zup\noligature{fi}nstrument
Replacements
ConTeXt has a method of replacing words that you can use for ligature exception dictionaries:
\mainlanguage[de] \definefontfeature[default] [mode=node,liga=yes,kern=yes,tlig=yes, ccmp=yes,language=dflt, protrusion=quality, expansion=quality] \replaceword[eg][Auflage][Au{fl}age] \replaceword[eg][Zupfinstrument][Zup{fi}nstrument] \starttext Auflage Zupfinstrument \setreplacements[eg] Auflage Zupfinstrument \stoptext
Much better. The first parameter os \replaceword is a set (collection) keycode, i.e. you can define different sets of replacements and activate them with \setreplacements.
In current versions (after 2017-09-28) you may also define several exceptions at once, like
\replaceword [eg] [Au{fl}age Schiff{f}ahrt Zup{fi}nstrument]
Find more details in the source: lang-rep.mkiv
Blocking
You can also define blocking of ligatures as a font feature:
\blockligatures[fi,ff] \blockligatures[fl] \blockligatures[au:fl:age] \definefontfeature[default:nolig][default][blockligatures=yes] \definedfont[Serif*default:nolig] % no ligatures fi ff fl Auflage Zupfinstrument \definedfont[Serif*default] % yes ligatures fi ff fl Auflage Zupfinstrument
While general blocking (\blockligatures[fi,fl]) works, the exception handling (\blockligatures[au:fl:age]) might depend on a version unpublished as of this writing (i.e. after 2017-09-28).