diff options
Diffstat (limited to 'doc/context/sources/general/fonts/fonts/fonts-appendix.tex')
-rw-r--r-- | doc/context/sources/general/fonts/fonts/fonts-appendix.tex | 484 |
1 files changed, 484 insertions, 0 deletions
diff --git a/doc/context/sources/general/fonts/fonts/fonts-appendix.tex b/doc/context/sources/general/fonts/fonts/fonts-appendix.tex new file mode 100644 index 000000000..ae42b10fa --- /dev/null +++ b/doc/context/sources/general/fonts/fonts/fonts-appendix.tex @@ -0,0 +1,484 @@ +% language=uk + +\startcomponent fonts-appendix + +\environment fonts-environment + +\startchapter[title=Appendix][color=darkgray] + +\startsection[title=The \type {tfm} file,reference=fontdata:tfm] + +The (binary) \type {tfm} file is not human readable but can be turned into a +verbose property list which is not that hard to understand. + +\starttyping +tftopl texnansi-lmr10.tfm +\stoptyping + +Here is an excerpt from the data file. It starts with some general properties of +the font. The \type {O} means that the value is in octal while the \type {R} is a +real. Keep in mind that \TEX\ has no datatype \quote {real} so internally it is +just integers representing scaled points. + +\startnarrowtyping +(FAMILY LMROMAN10) +(FACE O 352) +(CODINGSCHEME LY1 ENCODING /TEX'N'ANSI, Y&Y/) +(DESIGNSIZE R 10.0) +(COMMENT DESIGNSIZE IS IN POINTS) +(COMMENT OTHER SIZES ARE MULTIPLES OF DESIGNSIZE) +(CHECKSUM O 4720464277) +\stopnarrowtyping + +A text font has the following font dimensions: + +\startnarrowtyping +(FONTDIMEN + (SLANT R 0.0) + (SPACE R 0.333333) + (STRETCH R 0.166667) + (SHRINK R 0.111112) + (XHEIGHT R 0.43055) + (QUAD R 1.0) + (EXTRASPACE R 0.111112) + ... +) +\stopnarrowtyping + +Kerns and ligatures are packed into a table that is basically a sequence of +labelled entries. Here we see the entry for the character \type {f} which has +three ligatures: \type {ff}, \type {fi} and \type {fl}. Because ligatures can be +chained, octal slot 13 will have ligature entries for \type {ffl} and \type +{ffi}. + +\startnarrowtyping +(LIGTABLE + ... + (LABEL C f) + (LIG C f O 13) + (LIG C i O 14) + (LIG C l O 10) + (KRN O 135 R 0.027779) + (KRN O 41 R 0.027779) + (KRN O 51 R 0.027779) + (KRN O 77 R 0.027779) + (KRN O 223 R 0.027779) + (KRN O 224 R 0.027779) + (KRN O 140 R 0.027779) + (KRN O 47 R 0.027779) + (STOP) + ... +) +\stopnarrowtyping + +Each character gets its own entry. In this case there is no depth involved so it +is not shown. The comment is just a repetition of the entry in the ligtable. + +\startnarrowtyping +(CHARACTER C f + (CHARWD R 0.30555) + (CHARHT R 0.688875) + (CHARIC R 0.079222) + (COMMENT + (LIG C f O 13) + (LIG C i O 14) + (LIG C l O 10) + (KRN O 135 R 0.027779) + (KRN O 41 R 0.027779) + (KRN O 51 R 0.027779) + (KRN O 77 R 0.027779) + (KRN O 223 R 0.027779) + (KRN O 224 R 0.027779) + (KRN O 140 R 0.027779) + (KRN O 47 R 0.027779) + ) +) +\stopnarrowtyping + +\stopsection + +\startsection[title=The \type {vf} file,reference=fontdata:vf] + +A virtual font specification file can be converted to a more readable format with +\type {vftovp}, for instance: + +\starttyping +vftovp eurm10.vf +\stoptyping + +The information in a \type {vf} file will be combined with the data in the +accompanying \type {tfm} file so the output looks similar: + +\startnarrowtyping +(VTITLE ) +(FAMILY UNSPECIFIED) +(FACE F MRR) +(CODINGSCHEME TEX MATH ITALIC) +(DESIGNSIZE R 10.0) +(COMMENT DESIGNSIZE IS IN POINTS) +(COMMENT OTHER SIZES ARE MULTIPLES OF DESIGNSIZE) +(CHECKSUM O 24401046203) +(SEVENBITSAFEFLAG TRUE) +\stopnarrowtyping + +Because this font is a math font there is no space defined. + +\startnarrowtyping +(FONTDIMEN + (SLANT R 0.0) + (SPACE R 0.0) + (STRETCH R 0.0) + (SHRINK R 0.0) + (XHEIGHT R 0.459) + (QUAD R 1.0) + (EXTRASPACE R 0.0) +) +\stopnarrowtyping + +A virtual font will take glyphs from another font and therefore there are entries +that refer to these fonts. In the following definition index \type {0} is created +(the \type {D} specifies a decimal entry). + +\startnarrowtyping +(MAPFONT D 0 + (FONTNAME eurm10) + (FONTCHECKSUM O 4276740471) + (FONTAT R 1.0) + (FONTDSIZE R 10.0) +) +(MAPFONT D 1 + (FONTNAME cmmi10) + (FONTCHECKSUM O 1350061076) + (FONTAT R 1.0) + (FONTDSIZE R 10.0) +) +\stopnarrowtyping + +The zero indexed font is the default, so in the following entry this font is +taken: + +\startnarrowtyping +(CHARACTER C W + (CHARWD R 0.986) + (CHARHT R 0.691) + (CHARIC R 0.056) + (COMMENT + (KRN O 177 R 0.056) + (KRN O 75 R -0.056) + (KRN O 73 R -0.083) + (KRN O 72 R -0.083) + ) + (MAP + (SETCHAR C W) + ) +) +\stopnarrowtyping + +The next specification is a combination of two other glyphs becoming a new +glyph. We see here that the \type {MAP} table is actually a sort of program: + +\startnarrowtyping +(CHARACTER O 200 + (CHARWD R 0.622) + (CHARHT R 0.691) + (MAP + (PUSH) + (MOVEDOWN R -0.18) + (MOVERIGHT R 0.015) + (SELECTFONT D 2) + (SETCHAR O 40) + (POP) + (SELECTFONT D 0) + (SETCHAR C h) + ) +) +\stopnarrowtyping + +The character information is also in the \type {tfm} companion and that is what +\TEX\ uses. The virtual information kicks in when the backend is creating the +page stream and embedding the fonts. + +\stopsection + +\startsection[title=The \type {map} file,reference=fontdata:map] + +In a map file each line maps a font name onto a file that contains the font +shapes in bitmap or outline format. For instance in the file \type +{lm-texnansi.map} we find the line: + +\startnarrowtyping +texnansi-lmr10 LMRoman10-Regular "enclmtexnansi ReEncodeFont" <lm-texnansi.enc <lmr10.pfb +\stopnarrowtyping + +The backend will fetch the glyph data from \type {lmf10.pfb} and use the given +encoding file to resolve indices to glyph names. A \type {pfb} file can contain +more than 256 entries so names are used to access the data. The string between +quotes is used for the encoding vector in the resulting file. + +The second entry in the line is the font name that will be used. This name is +also used to control subset behaviour. Multiple references to this name will be +collapsed into one inclusion when possible, thereby making the file as small as +possible. You better make sure that the names are unique for a specific font. + +In addition to this, there can be directives for extending the font (horizontal +stretch) and transforming it into a slanted variant. Both are to be used with +care. + +In \MKIV\ map files are only used for virtual math fonts and just as in \MKII\ we +load such files selectively. Users don't have to worry about this. + +\stopsection + +\startsection[title=The \type {enc} file,reference=fontdata:enc] + +For historic reasons, an encoding file is a blob of \POSTSCRIPT, probably because +it can be copied into the final output directly. Given that \TEX\ got extended +anyway, you can wonder why this information never ended up in an extended \type +{tfm} or \type {vf} file. It had definitely made the traditional process much +more robust. + +\startnarrowtyping +/enclmtexnansi[ +/.notdef +/Euro +... +/dotaccent +/hungarumlaut +/ogonek +... +/ffi +/ffl +/dotlessi +/dotlessj +/grave +... +/thorn +/ydieresis +] def +\stopnarrowtyping + +There are excactly 256 entries in such a vector and the names should match those +in a \type {pfb} file. + +\stopsection + +\startsection[title=The \type {afm} file,reference=fontdata:afm] + +Here we show an excerpt from an \type {afm} file that comes with Latin Modern +Roman. Just as with a \type {tfm} file we start with some general information. +However we don't need to convert the file as is it already in human readable +format. + +\startnarrowtyping +StartFontMetrics 2.0 +Comment Generated by MetaType1 (a MetaPost-based engine) +Comment Creation Date: 7th October 2009 +Notice Copyright 2003--2009 by B. Jackowski and J.M. Nowacki (on behalf of TeX USERS GROUPS). +Comment Supported by CSTUG, DANTE eV, GUST, GUTenberg, NTG, and TUG. +Comment METATYPE1/Type 1 version by B. Jackowski & J. M. Nowacki +Comment from GUST (http://www.gust.org.pl). +Comment This work is released under the GUST Font License. +Comment For the most recent version of this license see +Comment This work has the LPPL maintenance status `maintained'. +Comment The Current Maintainer of this work is Bogus\l{}aw Jackowski and Janusz M. Nowacki. +Comment This work consists of the files listed in the MANIFEST-Latin-Modern.txt file. +FontName LMRoman10-Regular +FullName LMRoman10-Regular +FamilyName LMRoman10 +Weight Normal +ItalicAngle 0 +IsFixedPitch false +UnderlinePosition -146 +UnderlineThickness 40 +Version 2.004 +EncodingScheme FontSpecific +FontBBox -430 -290 1417 1127 +CapHeight 683.33333 +XHeight 430.55556 +Descender -194.44444 +Ascender 694.44444 +Comment PFM parameters: LMRoman10 0 0 0xEE +Comment TFM designsize: 10 (in points) +Comment TFM fontdimen 1: 0 (slant) +Comment TFM fontdimen 2: 3.33333 (space) +Comment TFM fontdimen 3: 1.66667 (space stretch) +Comment TFM fontdimen 4: 1.11111 (space shrink) +Comment TFM fontdimen 5: 4.3055 (xheight) +Comment TFM fontdimen 6: 10 (quad) +Comment TFM fontdimen 7: 1.11111 (extra space) +Comment TFM fontdimen 8: 6.833 (non-standard: uc height) +Comment TFM fontdimen 9: 6.9445 (non-standard: ascender) +Comment TFM fontdimen 10: 11.27 (non-standard: accented cap height) +Comment TFM fontdimen 11: 1.94443 (non-standard: descender depth) +Comment TFM fontdimen 12: 11.27 (non-standard: max height) +Comment TFM fontdimen 13: 2.9 (non-standard: max depth) +Comment TFM fontdimen 14: 5 (non-standard: digit width) +Comment TFM fontdimen 15: 0.88889 (non-standard: uc stem) +Comment TFM fontdimen 16: 12 (non-standard: baselineskip) +Comment TFM fontdimen 17: 0.69444 (non-standard: lc stem) +Comment TFM fontdimen 18: 0.55556 (non-standard: u, i.e., font unit) +Comment TFM fontdimen 19: 0.22223 (non-standard: overshoot) +Comment TFM fontdimen 20: 0.25 (non-standard: thin stem, hair) +Comment TFM fontdimen 21: 0.30556 (non-standard: cap thin stem, i.e., cap_hair) +Comment TFM headerbyte 9: FontSpecific +Comment TFM headerbyte 49: LMRoman10 +Comment TFM headerbyte 72: 234 +\stopnarrowtyping + +Watch the comments! Because \TEX\ needs a couple of so called fontdimens to be +set, the comments list the appropriate values. When a \type {tfm} file is +generated from an \type {afm} file, these values have to be used. + +Each character (or glyph) gets an entry. When we run out of indices i.e.\ pass +the 255 boundary (we start at 0) the index becomes \type {-1}. Only the width is +specified. The height and depth have to be derived from the bounding box for +which the specification starts with key \type {B}. + +\startnarrowtyping +StartCharMetrics 821 +... +C 32 ; WX 333.33333 ; N space ; B 0 0 0 0 ; +... +C 102 ; WX 305.55556 ; N f ; B 33 0 357 705 ; L f ff ; L i fi ; L k f_k ; L l fl ; +C 105 ; WX 277.77777 ; N i ; B 33 0 247 657 ; +C 108 ; WX 277.77777 ; N l ; B 33 0 255 694 ; +... +C -1 ; WX 500 ; N Acute ; B 181 493 388 656 ; +C -1 ; WX 500 ; N acute ; B 188 510 374 698 ; +C -1 ; WX 500 ; N acute.ts1 ; B 208 513 392 699 ; +... +EndCharMetrics +\stopnarrowtyping + +Watch how this font defines a space character and keep in mind that these fonts +date from the time that there was only one kind of space. The \type {L} entry +specifies a ligature. + +The names of glyphs are standardized, and even the \type {f_k} is conforming to +standards. This standardization makes it possible to go back from glyphs to characters +when copying text from a typeset document. + +The kern table is pretty large here and for a reason. First of all the file +defines 821 glyphs so the average amount of kerns per glyph is not that large. +But take a look at the \type {A}. Because the \type {Aacute} has the same shape +it kerns in a similar way. This means that ideally all combined characters end up +with the same value as their base glyph. However, in our case a bit more +selective approach is taken. The \type {Adieresis} has a different set of kerns, +probably to save space. It is for this reason that \OPENTYPE\ fonts have a model +of kern classes so that similar shapes can be treated as one when setting kerns. +You see a similar issue with ligatures, where often the right part of the shape +kerns the same as the (stand alone) first part of the shape does. + +\startnarrowtyping +StartKernData +StartKernPairs 9230 +... +KPX seven.prop hyphen.prop -37 +KPX seven.prop four.prop -74 +KPX seven.prop six.prop -18.5 +KPX hyphen.prop one.prop -37 +KPX hyphen.prop two.prop -18.5 +KPX hyphen.prop seven.prop -55.5 +KPX seven.oldstyle four.oldstyle -74 +KPX A T -83.333 +KPX Aacute T -83.333 +KPX Abreve T -83.333 +KPX Acircumflex T -83.333 +... +KPX Adieresis C -27.778 +... +KPX f bracketright 27.778 +KPX f exclam 27.778 +KPX f parenright 27.778 +KPX f question 27.778 +KPX f quotedblleft 27.778 +KPX f quotedblleft.cm 27.778 +KPX f quotedblright 27.778 +KPX f quotedblright.cm 27.778 +KPX f quoteleft 27.778 +KPX f quoteright 27.778 +... +KPX ff bracketright 27.778 +KPX ff exclam 27.778 +KPX ff parenright 27.778 +KPX ff question 27.778 +KPX ff quotedblleft 27.778 +KPX ff quotedblleft.cm 27.778 +KPX ff quotedblright 27.778 +KPX ff quotedblright.cm 27.778 +KPX ff quoteleft 27.778 +KPX ff quoteright 27.778 +... +EndKernPairs +EndKernData +\stopnarrowtyping + +If you look closely at the names, you will notice that some glyphs have a +variant. In \OPENTYPE\ fonts these variants are grouped in features like \type +{oldstyle}. The first part of such a name is still part of the standardization, +but the second part is up to the font designer. + +The file ends with: + +\startnarrowtyping +EndFontMetrics +\stopnarrowtyping + +\stopsection + +\startsection[title=The \type {otf} file,reference=fontdata:otf] + +In the \LUATEX\ manual you can find an overview of the raw \OTF\ format as +exposed in a \LUA\ table. The first decade of \LUATEX\ we used the built|-|in +loader but even then in \CONTEXT\ we didn't use that format directly but used it +to create a more compact and efficient table instead. The current release of +\CONTEXT\ uses its own loader written in \LUA, but the fundamentals have not +changed much. The tables are cached and can be read in at high speed. The +structure of the tables is unlikely to change much although more data might get +added. Although you can access the data it seldom makes sense to do so. Where +needed interfaces are provided. + +\stopsection + +\startsection[title=The \type {lfg} file,reference=fontdata:lua] + +We use the goodies file control what gets added, replaced, patched or manipulated +in a font. A goodie file permits us to go beyond what font provide by default. +The content of a goodie file differs per font. As we also use this for +experiments, not all entries that you find in such files are meant for users. + +\stopsection + +\startsection[title=Used fonts] + +The examples in the document depend on the fonts used. Here is a list of fonts used +to render this version. Because fonts might have changed in the meantime, some examples +might come out other than intended. + +\startluacode +local list = table.load("fonts-mkiv-usedfonts.lua") + +local NC, NR = context.NC, context.NR + +for i=1,#list do + local l = list[i] + context.starttabulate { "|lB|l|" } + local basename = string.lower(file.basename(l.filename)) + local version = string.lower(l.version) + local filesize = (l.size or 0) / 1000 .. " Kb" + local instances = l.instances or 1 + NC() context("filename") NC() context.type(basename) NC() NR() + NC() context("instances") NC() context.type(instances) NC() NR() + NC() context("filesize") NC() context.type(filesize) NC() NR() + NC() context("version") NC() context.type(version) NC() NR() + context.stoptabulate() +end + +\stopluacode + +\stopsection + +\stopchapter + +\stopcomponent + |