Hagen - Pragma ADE
Hagen - Pragma ADE Hagen - Pragma ADE
12 A.4 A.3 Font formats multiple accents which lead to many more distinctive heights and depths. Concerning ligatures we can remark that there are quite some substitutions possible although in practice only the multiple to one replacement has been used. Some fonts that are used in T E X started out as bitmaps but rather soon Type1 outline fonts became the fashion. These are supported using the map files that we will discuss later. First we look into Type1 fonts. 1.5 Type1 A.5 For a long time Type1 fonts have dominated the scene. These are PostScript fonts that can have more that 256 glyphs in the file that defines the shapes, but only 256 of them can be used at one time. Of course there can be multiple subsets active in one document. In traditional T E X a Type1 font is used by making a tfm file from a so called Adobe metric file (afm) that come with such a font. There are several tool chains for doing this and ConT E Xt MkII ships with one that can be of help when you need to support commercial fonts. Projects like the Latin Modern Fonts and T E X Gyre have normalized a whole lot of fonts that came in several more or less complete encodings into a consistent package of Type1 fonts. This already simplified live a lot but still users had to choose a suitable input and font encoding for their language and/or script. As T E X only cares about metrics and not about the rendering, it doesn’t consider Type1 fonts as something special. Also, as T E X and PostScript were developed about the same time support for Type1 fonts is rather present in T E X distributions. You can still follow this route but for ConT E Xt MkIV this is no longer the recommended way because there we have changed the whole subsystem to use Unicode. As a result we no longer use tfm files derived from afm files, but directly interpret the afm data. This not only removes the 256 limitation, but also brings more resolution in height and depth as we no longer have at most 16 alternatives. There can also be more kerns. Of course we need some heuristics to determine for instance the spacing but that is not different from former times. Because most T E X users don’t use commercial fonts, they will not notice that ConT E Xt MkIV treats Type1 fonts this way. One reason is that the free fonts also come as wide fonts in OpenType format and whenever possible ConT E Xt prefers OpenType over Type1 over tfm. In the beginning LuaT E X only could load a tfm file, which is why loading afm files is implemented in Lua. Later, when the OpenType loaded was added, loading pfb and afm files also became possible but it’s slower and we see no reason to rewrite the current code in ConT E Xt. We also do a couple of extra things when loading such a file. As more Type1 fonts move on to OpenType we don’t expect that much usage anyway. 1.6 OpenType A.6 When an engine can deal with Unicode directly it also means that internally it uses pretty large numbers for storing characters and glyph indices. The first T E X descendent that
went wide was Omega, later replaced by Aleph. However, this engine never took off and still used its own extended tfm format: ofm. In fact, as LuaT E X uses some of the Aleph code, it can also use these extended metric files but I don’t think that there are any useful fonts around so we can forget about this. We use the term OpenType for a couple of font formats that share the same principles: OpenType (otf), TrueType (ttf) and TrueType containers (ttc). The LuaT E X font reader presents them in a similar format. In the case of a TrueType container, one does not load the whole font but selects an instance from it. Internally an OpenType font can have the glyphs organized in subfonts. The first T E X descendent to really go wide from front to back is X Ǝ T E X. This engine can use OpenType fonts directly and for a whole category of users this opened up a new world. Hoever, it is still mostly a traditional engine. The transition from characters to glyphs is accomplished by external libraries, while in LuaT E X we code in Lua. This has the disadvantage that it is slower (although that depends on the job) but the advantage is that we have much more control and can extend the font handler as we like. An OpenType font is much more complex than a Type1 one. Unless it is a quick and dirty converted existing font, it will have more glyphs to start with. Quite likely it will have kerns and ligatures too and of course there are dimensions. However, there is no concept of a depth and height. These need to be deduced from the bounding box instead. There is an advance width. This means that we can start right away using such fonts if we map those properties onto the tfm table that LuaT E X expects. But there is more, take ligatures. In a traditional font the sequence ffi always becomes a ligature, given that the font has such a glyph. In LuaT E X there is a way to disable this mechanism, which is sometimes handy when dealing with mono-spaced fonts in verbatim. It’s pretty hard to disable that. For instance one option is to insert kerns manually. In an OpenType font ligatures are collected in a so called feature. There can be many such features and even kerning is a feature. Other examples are old style numerals, fractions, superiors, inferiors, historic ligatures and stylistic alternates. onum -1 tnum -1 pnum -1 1234567890 ¢ $ 1234567890 ¢ $ 1234567890 ¢ $ To this all you need to add that features operate in two dimensions: languages and scripts. This means that when ligatures are enabled for Dutch the ij sequence becomes a single glyph but for German it gets mapped onto two glyphs. And, to make it even more complex, a substitution can depend on circumstances, which means that for Dutch fijn becomes f ij n but fiets becomes fi ets. It will be no surprise that not all OpenType fonts come with a complete and rich repertoire of rules. To make things worse, there 13 Font formats
- Page 1: explaining luatex and mkiv Fonts ou
- Page 4 and 5: 2 Contents 5.4 Goodies 73 5.5 Analy
- Page 6 and 7: 4 Contents
- Page 8 and 9: 6 Introduction In this manual we wi
- Page 10 and 11: 8 Font formats a b g l q . ; ? ffi
- Page 12 and 13: 10 Font formats When T E X ships ou
- Page 16 and 17: 14 Font formats can be rules that t
- Page 18 and 19: 16 Font formats /fonts/tfm/vendor/t
- Page 20 and 21: 18 Modes raw tfm normalized tfm raw
- Page 22 and 23: 20 Modes shown next: kern cyrl dflt
- Page 24 and 25: 22 Modes ccmp cyrl mkd абвгде
- Page 26 and 27: 24 Modes dlig latn gag abcdefghijkl
- Page 28 and 29: 26 Modes liga latn nsm abcdefghijkl
- Page 30 and 31: 28 Modes salt latn mol abcdefghijkl
- Page 32 and 33: 30 Modes glyph 256 font 42: U+00074
- Page 34 and 35: 32 Modes glyph 256 font 33: U+00061
- Page 36 and 37: 34 Modes glyph 256 font 33: U+00065
- Page 38 and 39: 36 Modes optimizer that can apply a
- Page 40 and 41: 38 Modes ا خLJَ﮲ ف﮲َ step
- Page 42 and 43: 40 Modes dir +TRT glyph 256 font 49
- Page 44 and 45: 42 Modes and now we get: 123 normal
- Page 46 and 47: 44 Modes MkIV run can be faster tha
- Page 48 and 49: 46 Lookups \font \MyFontG = lmr12 s
- Page 50 and 51: 48 Lookups 3.4 Name Say that we wan
- Page 52 and 53: 50 Lookups We add another specifier
- Page 54 and 55: 52 Methods \definefont [MyFont] [Bo
- Page 56 and 57: 54 Methods } copyright = "ConTeXt d
- Page 58 and 59: 56 Features of all, all we get to s
- Page 60 and 61: 58 Features in base mode. A single
- Page 62 and 63: 60 Features accumulate within a wor
went wide was Omega, later replaced by Aleph. However, this engine never took off<br />
and still used its own extended tfm format: ofm. In fact, as LuaT E X uses some of the<br />
Aleph code, it can also use these extended metric files but I don’t think that there are<br />
any useful fonts around so we can forget about this.<br />
We use the term OpenType for a couple of font formats that share the same principles:<br />
OpenType (otf), TrueType (ttf) and TrueType containers (ttc). The LuaT E X font reader<br />
presents them in a similar format. In the case of a TrueType container, one does not<br />
load the whole font but selects an instance from it. Internally an OpenType font can<br />
have the glyphs organized in subfonts.<br />
The first T E X descendent to really go wide from front to back is X Ǝ T E X. This engine<br />
can use OpenType fonts directly and for a whole category of users this opened up a new<br />
world. Hoever, it is still mostly a traditional engine. The transition from characters to<br />
glyphs is accomplished by external libraries, while in LuaT E X we code in Lua. This has<br />
the disadvantage that it is slower (although that depends on the job) but the advantage<br />
is that we have much more control and can extend the font handler as we like.<br />
An OpenType font is much more complex than a Type1 one. Unless it is a quick and<br />
dirty converted existing font, it will have more glyphs to start with. Quite likely it will<br />
have kerns and ligatures too and of course there are dimensions. However, there is no<br />
concept of a depth and height. These need to be deduced from the bounding box instead.<br />
There is an advance width. This means that we can start right away using such fonts if<br />
we map those properties onto the tfm table that LuaT E X expects.<br />
But there is more, take ligatures. In a traditional font the sequence ffi always becomes<br />
a ligature, given that the font has such a glyph. In LuaT E X there is a way to disable<br />
this mechanism, which is sometimes handy when dealing with mono-spaced fonts<br />
in verbatim. It’s pretty hard to disable that. For instance one option is to insert kerns<br />
manually. In an OpenType font ligatures are collected in a so called feature. There<br />
can be many such features and even kerning is a feature. Other examples are old style<br />
numerals, fractions, superiors, inferiors, historic ligatures and stylistic alternates.<br />
onum -1<br />
tnum -1<br />
pnum -1<br />
1234567890 ¢ $<br />
1234567890 ¢ $<br />
1234567890 ¢ $<br />
To this all you need to add that features operate in two dimensions: languages and<br />
scripts. This means that when ligatures are enabled for Dutch the ij sequence becomes<br />
a single glyph but for German it gets mapped onto two glyphs. And, to make it even more<br />
complex, a substitution can depend on circumstances, which means that for Dutch fijn<br />
becomes f ij n but fiets becomes fi ets. It will be no surprise that not all OpenType<br />
fonts come with a complete and rich repertoire of rules. To make things worse, there<br />
13<br />
Font formats