diff options
Diffstat (limited to 'Master/texmf-dist/fonts/source/public/fetamont/ffmbase.mf')
-rw-r--r-- | Master/texmf-dist/fonts/source/public/fetamont/ffmbase.mf | 1306 |
1 files changed, 1306 insertions, 0 deletions
diff --git a/Master/texmf-dist/fonts/source/public/fetamont/ffmbase.mf b/Master/texmf-dist/fonts/source/public/fetamont/ffmbase.mf new file mode 100644 index 00000000000..dee523c8b8d --- /dev/null +++ b/Master/texmf-dist/fonts/source/public/fetamont/ffmbase.mf @@ -0,0 +1,1306 @@ +% The Fetamont typeface extends the Logo fonts to +% complete the T1 encoding. The designs of the glyphs +% A, E, F, M, N, O, P, S, T are based on the +% Metafont constructions by D. E. Knuth. +% The glyphs Y and 1 imitate the shapes of the +% corresponding glyphs in the METATYPE1 logo +% that is due to the METATYPE1 team (Boguslaw Jackowski, +% Janusz M. Nowacki and Piotr Strzelczyk). +% There exists a LaTeX package for the Fetamont +% typeface. Both the package and the typeface +% are distributed under the terms of the +% LaTeX Project Public License (LPPL). + +mode_setup; +if unknown slant: slant:=0 else: currenttransform:= + identity slanted slant yscaled aspect_ratio fi; + +ho#:=o#; % horizontal overshoot +leftstemloc#:=2.5u#+s#; % position of left stem + +font_quad 18u#+2s#; +font_normal_space 6u#+2s#; +font_normal_stretch 3u#; +font_normal_shrink 2u#; +font_coding_scheme "T1"; + +define_pixels(s,u); +define_whole_pixels(xgap); +define_whole_vertical_pixels(ygap); +define_blacker_pixels(px,py); +pickup pencircle xscaled px yscaled py rotated prot; +logo_pen:=savepen; +define_good_x_pixels(leftstemloc); +define_good_y_pixels(barheight,x_ht,ht); +define_corrected_pixels(o); +define_horizontal_corrected_pixels(ho); + +% enc encodes names to numbers, so enc("A")=65 +% altough defining an array first seems to be +% a good idea, it turns out that this variant +% is significantly faster! +def enc(expr name)= + if (font_coding_scheme_="T1"): + if name="grave": + 0 + elseif name="acute": + 1 + elseif name="circumflex": + 2 + elseif name="tilde": + 3 + elseif name="dieresis": + 4 + elseif name="hungarumlaut": + 5 + elseif name="ring": + 6 + elseif name="caron": + 7 + elseif name="breve": + 8 + elseif name="macron": + 9 + elseif name="dotaccent": + 10 + elseif name="cedilla": + 11 + elseif name="ogonek": + 12 + elseif name="quotesinglbase": + 13 + elseif name="guilsinglleft": + 14 + elseif name="guilsinglright": + 15 + elseif name="quotedblleft": + 16 + elseif name="quotedblright": + 17 + elseif name="quotedblbase": + 18 + elseif name="guillemotleft": + 19 + elseif name="guillemotright": + 20 + elseif name="endash": + 21 + elseif name="emdash": + 22 + elseif name="cwm": + 23 + elseif name="perthousandzero": + 24 + elseif name="dotlessi": + 25 + elseif name="dotlessj": + 26 + elseif name="ff": + 27 + elseif name="fi": + 28 + elseif name="fl": + 29 + elseif name="ffi": + 30 + elseif name="ffl": + 31 + elseif name="visiblespace": + 32 + elseif name="exclam": + 33 + elseif name="quotedbl": + 34 + elseif name="numbersign": + 35 + elseif name="dollar": + 36 + elseif name="percent": + 37 + elseif name="ampersand": + 38 + elseif name="quoteright": + 39 + elseif name="parenleft": + 40 + elseif name="parenright": + 41 + elseif name="asterisk": + 42 + elseif name="plus": + 43 + elseif name="comma": + 44 + elseif name="hyphen": + 45 + elseif name="period": + 46 + elseif name="slash": + 47 + elseif name="zero": + 48 + elseif name="one": + 49 + elseif name="two": + 50 + elseif name="three": + 51 + elseif name="four": + 52 + elseif name="five": + 53 + elseif name="six": + 54 + elseif name="seven": + 55 + elseif name="eight": + 56 + elseif name="nine": + 57 + elseif name="colon": + 58 + elseif name="semicolon": + 59 + elseif name="less": + 60 + elseif name="equal": + 61 + elseif name="greater": + 62 + elseif name="question": + 63 + elseif name="at": + 64 + elseif name="A": + 65 + elseif name="B": + 66 + elseif name="C": + 67 + elseif name="D": + 68 + elseif name="E": + 69 + elseif name="F": + 70 + elseif name="G": + 71 + elseif name="H": + 72 + elseif name="I": + 73 + elseif name="J": + 74 + elseif name="K": + 75 + elseif name="L": + 76 + elseif name="M": + 77 + elseif name="N": + 78 + elseif name="O": + 79 + elseif name="P": + 80 + elseif name="Q": + 81 + elseif name="R": + 82 + elseif name="S": + 83 + elseif name="T": + 84 + elseif name="U": + 85 + elseif name="V": + 86 + elseif name="W": + 87 + elseif name="X": + 88 + elseif name="Y": + 89 + elseif name="Z": + 90 + elseif name="bracketleft": + 91 + elseif name="backslash": + 92 + elseif name="bracketright": + 93 + elseif name="asciicircum": + 94 + elseif name="underscore": + 95 + elseif name="quoteleft": + 96 + elseif name="a": + 97 + elseif name="b": + 98 + elseif name="c": + 99 + elseif name="d": + 100 + elseif name="e": + 101 + elseif name="f": + 102 + elseif name="g": + 103 + elseif name="h": + 104 + elseif name="i": + 105 + elseif name="j": + 106 + elseif name="k": + 107 + elseif name="l": + 108 + elseif name="m": + 109 + elseif name="n": + 110 + elseif name="o": + 111 + elseif name="p": + 112 + elseif name="q": + 113 + elseif name="r": + 114 + elseif name="s": + 115 + elseif name="t": + 116 + elseif name="u": + 117 + elseif name="v": + 118 + elseif name="w": + 119 + elseif name="x": + 120 + elseif name="y": + 121 + elseif name="z": + 122 + elseif name="braceleft": + 123 + elseif name="bar": + 124 + elseif name="braceright": + 125 + elseif name="asciitilde": + 126 + elseif name="dash": + 127 + elseif name="Abreve": + 128 + elseif name="Aogonek": + 129 + elseif name="Cacute": + 130 + elseif name="Ccaron": + 131 + elseif name="Dcaron": + 132 + elseif name="Ecaron": + 133 + elseif name="Eogonek": + 134 + elseif name="Gbreve": + 135 + elseif name="Lacute": + 136 + elseif name="Lcaron": + 137 + elseif name="Lslash": + 138 + elseif name="Nacute": + 139 + elseif name="Ncaron": + 140 + elseif name="Eng": + 141 + elseif name="Ohungarumlaut": + 142 + elseif name="Racute": + 143 + elseif name="Rcaron": + 144 + elseif name="Sacute": + 145 + elseif name="Scaron": + 146 + elseif name="Scedilla": + 147 + elseif name="Tcaron": + 148 + elseif name="Tcedilla": + 149 + elseif name="Uhungarumlaut": + 150 + elseif name="Uring": + 151 + elseif name="Ydieresis": + 152 + elseif name="Zacute": + 153 + elseif name="Zcaron": + 154 + elseif name="Zdotaccent": + 155 + elseif name="IJ": + 156 + elseif name="Idotaccent": + 157 + elseif name="dcroat": + 158 + elseif name="section": + 159 + elseif name="abreve": + 160 + elseif name="aogonek": + 161 + elseif name="cacute": + 162 + elseif name="ccaron": + 163 + elseif name="dcaron": + 164 + elseif name="ecaron": + 165 + elseif name="eogonek": + 166 + elseif name="gbreve": + 167 + elseif name="lacute": + 168 + elseif name="lcaron": + 169 + elseif name="lslash": + 170 + elseif name="nacute": + 171 + elseif name="ncaron": + 172 + elseif name="eng": + 173 + elseif name="ohungarumlaut": + 174 + elseif name="racute": + 175 + elseif name="rcaron": + 176 + elseif name="sacute": + 177 + elseif name="scaron": + 178 + elseif name="scedilla": + 179 + elseif name="tcaron": + 180 + elseif name="tcedilla": + 181 + elseif name="uhungarumlaut": + 182 + elseif name="uring": + 183 + elseif name="ydieresis": + 184 + elseif name="zacute": + 185 + elseif name="zcaron": + 186 + elseif name="zdotaccent": + 187 + elseif name="ij": + 188 + elseif name="exclamdown": + 189 + elseif name="questiondown": + 190 + elseif name="sterling": + 191 + elseif name="Agrave": + 192 + elseif name="Aacute": + 193 + elseif name="Acircumflex": + 194 + elseif name="Atilde": + 195 + elseif name="Adieresis": + 196 + elseif name="Aring": + 197 + elseif name="AE": + 198 + elseif name="Ccedilla": + 199 + elseif name="Egrave": + 200 + elseif name="Eacute": + 201 + elseif name="Ecircumflex": + 202 + elseif name="Edieresis": + 203 + elseif name="Igrave": + 204 + elseif name="Iacute": + 205 + elseif name="Icircumflex": + 206 + elseif name="Idieresis": + 207 + elseif name="Eth": + 208 + elseif name="Ntilde": + 209 + elseif name="Ograve": + 210 + elseif name="Oacute": + 211 + elseif name="Ocircumflex": + 212 + elseif name="Otilde": + 213 + elseif name="Odieresis": + 214 + elseif name="OE": + 215 + elseif name="Oslash": + 216 + elseif name="Ugrave": + 217 + elseif name="Uacute": + 218 + elseif name="Ucircumflex": + 219 + elseif name="Udieresis": + 220 + elseif name="Yacute": + 221 + elseif name="Thorn": + 222 + elseif name="Germandbls": + 223 + elseif name="agrave": + 224 + elseif name="aacute": + 225 + elseif name="acircumflex": + 226 + elseif name="atilde": + 227 + elseif name="adieresis": + 228 + elseif name="aring": + 229 + elseif name="ae": + 230 + elseif name="ccedilla": + 231 + elseif name="egrave": + 232 + elseif name="eacute": + 233 + elseif name="ecircumflex": + 234 + elseif name="edieresis": + 235 + elseif name="igrave": + 236 + elseif name="iacute": + 237 + elseif name="icircumflex": + 238 + elseif name="idieresis": + 239 + elseif name="eth": + 240 + elseif name="ntilde": + 241 + elseif name="ograve": + 242 + elseif name="oacute": + 243 + elseif name="ocircumflex": + 244 + elseif name="otilde": + 245 + elseif name="odieresis": + 246 + elseif name="oe": + 247 + elseif name="oslash": + 248 + elseif name="ugrave": + 249 + elseif name="uacute": + 250 + elseif name="ucircumflex": + 251 + elseif name="udieresis": + 252 + elseif name="yacute": + 253 + elseif name="thorn": + 254 + elseif name="germandbls": + 255 + else: + errmessage("unknown name to encode"); + fi + else: + errmessage("tell me somewhere that the font_coding_scheme is T1"); + fi +enddef; + +% the randomization is fixed +% but still special for every style +fixedseed:=2.71828designsize; +for i=1 upto length font_identifier_: + fixedseed:=fixedseed + +sqrt(ASCII(substring (i-1,i) of font_identifier_)); +endfor +randomseed:=fixedseed; + +vardef noise = + normaldeviate*craziness +enddef; + +vardef randrt = %random direction towards right + (12u,normaldeviate*craziness) +enddef; + +vardef randup = %random direction towards up + (normaldeviate*craziness,ht) +enddef; + +code_offset:=0; %later used for small caps + +numeric charwidths_[]; +numeric charheights_[]; +numeric chardepths_[]; +numeric charitalcorrs_[]; +picture charpictures_[]; +pair charanchortops_[]; +pair charanchorbots_[]; +pair charanchortoprights_[]; + +def ffmchar(expr name, unit_width, height, depth) = + beginchar(enc(name)+code_offset,if unit_width=0: 0 else: unit_width*u#+2s# fi,height,depth); + pickup logo_pen +enddef; + +extra_endchar := extra_endchar&"charpictures_[charcode]:=currentpicture;" + &"charwidths_[charcode]=charwd;" + &"charheights_[charcode]=charht;" + &"chardepths_[charcode]=chardp;" + &"charitalcorrs_[charcode]=charic;"; + +def ffmcombinedchar(expr namea,nameb,namec,anchor,height,depth) = + widthb:=charwidths_[enc(nameb)+code_offset]; + charicb:=charitalcorrs_[enc(nameb)+code_offset]; + beginchar(enc(namea)+code_offset,widthb,height,depth); + charic:=charicb; + addto currentpicture also charpictures_[enc(nameb)+code_offset]; + if anchor="top": + addto currentpicture also charpictures_[enc(namec)] shifted + ((charanchortops_[enc(nameb)+code_offset]-charanchortops_[enc(namec)]) slanted slant); + elseif anchor="bot": + addto currentpicture also charpictures_[enc(namec)] shifted + ((charanchorbots_[enc(nameb)+code_offset]-charanchorbots_[enc(namec)]) slanted slant); + elseif anchor="topright": + addto currentpicture also charpictures_[enc(namec)] shifted + ((charanchortoprights_[enc(nameb)+code_offset]-charanchortoprights_[enc(namec)]) slanted slant); + else: + errmessage "Wrong anchor name"; + fi + endchar; +enddef; + +% chain two chars like "f" and "l" to "fl" +def ffmchainedchar(expr namea,nameb,namec) = + beginchar( + enc(namea), + charwidths_[enc(nameb)] + +charwidths_[enc(namec)], + max(charheights_[enc(nameb)], + +charheights_[enc(namec)]), + max(chardepths_[enc(nameb)], + +chardepths_[enc(namec)]) + ); + charic:=charitalcorrs_[enc(nameb)]; + addto currentpicture also charpictures_[enc(nameb)]; + addto currentpicture also charpictures_[enc(namec)] shifted (charwidths_[enc(nameb)]*hppp,0); + endchar; +enddef; + +% an arc is kind of a quarter of a skewed superellipse +vardef arc(expr zi,diri,zj,dirj) = + zi{diri}... + begingroup + save corner,zij; + pair corner,zij; + corner=zi+whatever*diri=zj+whatever*dirj; + zij=zi + +superness*(corner-zi) + +(1-superness)*(zj-corner); + zij + endgroup{zj-zi} + ...zj{dirj} +enddef; + +% two concatenated arcs +def half(expr zi,diri,zj,dirj,zk,dirk) = + arc(zi,diri,zj,dirj) + & arc(zj,dirj,zk,dirk) +enddef; + +% two concatenated halfs +def full(expr zi,diri,zj,dirj,zk,dirk,zl,dirl) = + half(zi,diri,zj,dirj,zk,dirk) + & half(zk,dirk,zl,dirl,zi,diri) +enddef; + +% for dots... +def dotcircle(expr zi,zj) = + zi..zj..cycle & zi +enddef; + +% accents +input ffmchar_acute +input ffmchar_grave +input ffmchar_dieresis +input ffmchar_circumflex +input ffmchar_tilde +input ffmchar_hungarumlaut +input ffmchar_ring +input ffmchar_caron +input ffmchar_breve +input ffmchar_macron +input ffmchar_dotaccent +input ffmchar_cedilla +input ffmchar_ogonek +% punctation +input ffmchar_visiblespace +input ffmchar_period +input ffmchar_colon +input ffmchar_comma +input ffmchar_semicolon +input ffmchar_exclam +input ffmchar_question +input ffmchar_parenleft +input ffmchar_parenright +input ffmchar_hyphen +input ffmchar_emdash +input ffmchar_endash +input ffmchar_cwm +input ffmchar_quotedbl +input ffmchar_quoteleft +input ffmchar_quoteright +input ffmchar_quotedblleft +input ffmchar_quotedblright +input ffmchar_quotesinglbase +input ffmchar_quotedblbase +input ffmchar_guilsinglleft +input ffmchar_guilsinglright +input ffmchar_guillemotleft +input ffmchar_guillemotright +input ffmchar_percent +input ffmchar_perthousandzero +input ffmchar_slash +input ffmchar_plus +input ffmchar_equal +input ffmchar_numbersign +input ffmchar_dollar +input ffmchar_ampersand +input ffmchar_asterisk +input ffmchar_less +input ffmchar_greater +input ffmchar_at +input ffmchar_bracketleft +input ffmchar_backslash +input ffmchar_bracketright +input ffmchar_asciicircum +input ffmchar_underscore +input ffmchar_braceleft +input ffmchar_bar +input ffmchar_braceright +input ffmchar_asciitilde +input ffmchar_dash +input ffmchar_section +input ffmchar_exclamdown +input ffmchar_questiondown +input ffmchar_sterling +% uppercase letters +input ffmchar_A +input ffmchar_AE +input ffmchar_B +input ffmchar_C +input ffmchar_D +input ffmchar_Eth +input ffmchar_E +input ffmchar_F +input ffmchar_G +input ffmchar_H +input ffmchar_I +input ffmchar_J +input ffmchar_K +input ffmchar_L +input ffmchar_Lslash +input ffmchar_M +input ffmchar_N +input ffmchar_Eng +input ffmchar_O +input ffmchar_OE +input ffmchar_P +input ffmchar_Thorn +input ffmchar_Q +input ffmchar_R +input ffmchar_S +input ffmchar_Germandbls +input ffmchar_T +input ffmchar_U +input ffmchar_V +input ffmchar_W +input ffmchar_X +input ffmchar_Y +input ffmchar_Z +% chained uppercase letters +input ffmchar_IJ +% combined uppercase letters +input ffmchar_Aacute +input ffmchar_Agrave +input ffmchar_Adieresis +input ffmchar_Acircumflex +input ffmchar_Atilde +input ffmchar_Aring +input ffmchar_Abreve +input ffmchar_Aogonek +input ffmchar_Cacute +input ffmchar_Ccaron +input ffmchar_Ccedilla +input ffmchar_Dcaron +input ffmchar_Eacute +input ffmchar_Egrave +input ffmchar_Edieresis +input ffmchar_Ecircumflex +input ffmchar_Ecaron +input ffmchar_Eogonek +input ffmchar_Gbreve +input ffmchar_Iacute +input ffmchar_Igrave +input ffmchar_Idieresis +input ffmchar_Icircumflex +input ffmchar_Idotaccent +input ffmchar_Lacute +input ffmchar_Lcaron +input ffmchar_Nacute +input ffmchar_Ntilde +input ffmchar_Ncaron +input ffmchar_Oacute +input ffmchar_Ograve +input ffmchar_Odieresis +input ffmchar_Ocircumflex +input ffmchar_Otilde +input ffmchar_Ohungarumlaut +input ffmchar_Oslash +input ffmchar_Racute +input ffmchar_Rcaron +input ffmchar_Sacute +input ffmchar_Scaron +input ffmchar_Scedilla +input ffmchar_Tcaron +input ffmchar_Tcedilla +input ffmchar_Uacute +input ffmchar_Ugrave +input ffmchar_Udieresis +input ffmchar_Ucircumflex +input ffmchar_Uhungarumlaut +input ffmchar_Uring +input ffmchar_Yacute +input ffmchar_Ydieresis +input ffmchar_Zacute +input ffmchar_Zcaron +input ffmchar_Zdotaccent +% digits +input ffmchar_zero +input ffmchar_one +input ffmchar_two +input ffmchar_three +input ffmchar_four +input ffmchar_five +input ffmchar_six +input ffmchar_seven +input ffmchar_eight +input ffmchar_nine + +% now try again with lowercase settings +ht#:=x_ht#; % new characters height (for lowercase) +u#:=.9u#; % new unit width +barheight#:=.5x_ht#; % new height of bar lines (for lowercase) +define_pixels(u); +define_good_y_pixels(barheight); + +code_offset:=ASCII"a" - ASCII"A"; + +% majuscules (in lowercase positions) +input ffmchar_A +input ffmchar_AE +input ffmchar_B +input ffmchar_C +input ffmchar_D +input ffmchar_Eth +input ffmchar_E +input ffmchar_F +input ffmchar_G +input ffmchar_H +input ffmchar_I +input ffmchar_J +input ffmchar_K +input ffmchar_L +input ffmchar_Lslash +input ffmchar_M +input ffmchar_N +input ffmchar_Eng +input ffmchar_O +input ffmchar_OE +input ffmchar_P +input ffmchar_Thorn +input ffmchar_Q +input ffmchar_R +input ffmchar_S +input ffmchar_Germandbls +input ffmchar_T +input ffmchar_U +input ffmchar_V +input ffmchar_W +input ffmchar_X +input ffmchar_Y +input ffmchar_Z +% chained lowercase letters +input ffmchar_ff +input ffmchar_fi +input ffmchar_fl +input ffmchar_ffi +input ffmchar_ffl +input ffmchar_ijlower +% combined lowercase letters +input ffmchar_Aacute +input ffmchar_Agrave +input ffmchar_Adieresis +input ffmchar_Acircumflex +input ffmchar_Atilde +input ffmchar_Aring +input ffmchar_Abreve +input ffmchar_Aogonek +input ffmchar_Cacute +input ffmchar_Ccaron +input ffmchar_Ccedilla +input ffmchar_Dcaron +input ffmchar_Eacute +input ffmchar_Egrave +input ffmchar_Edieresis +input ffmchar_Ecircumflex +input ffmchar_Ecaron +input ffmchar_Eogonek +input ffmchar_Gbreve +input ffmchar_Iacute +input ffmchar_Igrave +input ffmchar_Idieresis +input ffmchar_Icircumflex +input ffmchar_Lacute +input ffmchar_Lcaron +input ffmchar_Nacute +input ffmchar_Ntilde +input ffmchar_Ncaron +input ffmchar_Oacute +input ffmchar_Ograve +input ffmchar_Odieresis +input ffmchar_Ocircumflex +input ffmchar_Otilde +input ffmchar_Ohungarumlaut +input ffmchar_Oslash +input ffmchar_Racute +input ffmchar_Rcaron +input ffmchar_Sacute +input ffmchar_Scaron +input ffmchar_Scedilla +input ffmchar_Tcaron +input ffmchar_Tcedilla +input ffmchar_Uacute +input ffmchar_Ugrave +input ffmchar_Udieresis +input ffmchar_Ucircumflex +input ffmchar_Uhungarumlaut +input ffmchar_Uring +input ffmchar_Yacute +input ffmchar_Ydieresis +input ffmchar_Zacute +input ffmchar_Zcaron +input ffmchar_Zdotaccent +% the dotless section (dotlessi, dotlessj) +code_offset:=-48; +input ffmchar_I +input ffmchar_J +% dstroke is here a smaller variant of Eth +code_offset:=-50; +input ffmchar_Eth +% restore the most important things +code_offset:=0; +u#:=u#/.9; +define_pixels(u); + +% kernings +numeric kernclassesf_[][], % list of kerning classes (first position) + kernclassess_[][], % list of kerning classes (second position) + ligmatrix_[][][]; % matrix with kern and ligature entries: 255 times X times 2 +kernclassesf_[0][0]=0; % number of kernclassesf (will be increased) +kernclassess_[0][0]=0; % number of kernclassess (will be increased) +for i=0 upto 255: + ligmatrix_[i][0][0]:=0; % every char i begins with no kernings (will be increased) +endfor + +def addkernclassf(text a) = % add a kerning class to kernclassesf + kernclassesf_[0][0]:=kernclassesf_[0][0]+1; % number of kernclassesf + begingroup + save i; + i:=0; % number of chars in current class + for b=a: + i:=i+1; + kernclassesf_[kernclassesf_[0][0]][i]:=enc(b); + endfor + % number of chars in current class is stored at 0th position + kernclassesf_[kernclassesf_[0][0]][0]:=i; + endgroup +enddef; + +def addkernclasss(text a) = % add a kerning class to kernclassess + kernclassess_[0][0]:=kernclassess_[0][0]+1; % number of kernclassess + begingroup + save i,n; + n:=kernclassess_[0][0]; % current last class (being written) + i:=0; % number of chars in current class + for b=a: + i:=i+1; + kernclassess_[n][i]:=enc(b); + endfor + % number of chars in current class is stored at 0th position + kernclassess_[n][0]:=i; + endgroup +enddef; + +def addlig(expr first,second,third) = % replace first and second to the ligature third + begingroup + save i,n; + i:=enc(first); % encoding number of first + ligmatrix_[i][0][0]:=ligmatrix_[i][0][0]+1; + n:=ligmatrix_[i][0][0]; % current last ligature entry index of i (being written) + ligmatrix_[i][0][0]:=n; + ligmatrix_[i][n][0]:=-enc(second); % the minus is a flag for "ligature" instead of "kern" + ligmatrix_[i][n][1]:=enc(third); + endgroup +enddef; + +def addclasskern(expr first,second,kvalue) = % kern all chars of first class and second class by kvalue + begingroup + save i,j,m,n; + % get the indices i and j of the two classes: + i:=0; % default value (cannot be true) + j:=0; % default value (cannot be true) + forever: + i:=i+1; + exitif kernclassesf_[i][1]=enc(first); + if i>255: + errmessage("unknown first kerning class"); + fi + endfor + forever: + j:=j+1; + exitif kernclassess_[j][1]=enc(second); + if j>255: + errmessage("unknown first kerning class"); + fi + endfor + for k=1 upto kernclassesf_[i][0]: + m:=kernclassesf_[i][k]; % current first glyph + for l=1 upto kernclassess_[j][0]: + ligmatrix_[m][0][0]:=ligmatrix_[m][0][0]+1; + n:=ligmatrix_[m][0][0]; % current last entry index (being written) + ligmatrix_[m][n][0]:=kernclassess_[j][l]; + ligmatrix_[m][n][1]:=kvalue; + endfor + endfor + endgroup +enddef; + +def writeligtable = % write all kernings/ligatures at once + begingroup + save n; + for i=0 upto 255: % current glyph i + n:=ligmatrix_[i][0][0]; % number n of entries for glyph i + if n<>0: % skip empty entries + ligtable i: + for j=1 upto n-1: %last entry needs a semicolon + if ligmatrix_[i][j][0]<0: % the minus is a flag for "ligature" + -ligmatrix_[i][j][0]=:ligmatrix_[i][j][1], + else: + ligmatrix_[i][j][0] kern ligmatrix_[i][j][1], + fi + endfor + %last entry needs a semicolon: + if ligmatrix_[i][n][0]<0: % the minus is a flag for "ligature" + -ligmatrix_[i][n][0]=:ligmatrix_[i][n][1]; + else: + ligmatrix_[i][n][0] kern ligmatrix_[i][n][1]; + fi + fi + endfor + endgroup +enddef; + +addkernclassf("A","Abreve","Aogonek","Agrave","Aacute","Acircumflex","Atilde","Adieresis","Aring"); +addkernclassf("B"); +addkernclassf("C","Cacute","Ccaron","Ccedilla"); +addkernclassf("D","Dcaron","O","Ohungarumlaut","Ograve","Oacute","Ocircumflex","Otilde","Odieresis","Eth"); +addkernclassf("F"); +addkernclassf("J","U","Uhungarumlaut","Ugrave","Uacute","Ucircumflex","Udieresis","IJ","Oslash"); +addkernclassf("K","X"); +addkernclassf("L","Lacute","Lcaron","Lslash"); +addkernclassf("P"); +addkernclassf("Thorn"); +addkernclassf("Q"); +addkernclassf("R","Racute","Rcaron"); +addkernclassf("S","Sacute","Scedilla","Scaron"); +addkernclassf("T","Tcaron","Tcedilla"); +addkernclassf("V","W"); +addkernclassf("Y","Ydieresis","Yacute"); +addkernclassf("a","abreve","aogonek","agrave","aacute","acircumflex","atilde","adieresis","aring"); +addkernclassf("b"); +addkernclassf("c","cacute","ccaron","ccedilla"); +addkernclassf("d","dcaron","o","ohungarumlaut","ograve","oacute","ocircumflex","otilde","odieresis","eth"); +addkernclassf("f"); +addkernclassf("j","u","uhungarumlaut","ugrave","uacute","ucircumflex","udieresis","ij","oslash"); +addkernclassf("k","x"); +addkernclassf("l","lacute","lcaron","lslash"); +addkernclassf("p"); +addkernclassf("thorn"); +addkernclassf("q"); +addkernclassf("r","racute","rcaron"); +addkernclassf("s","scedilla","sacute","scaron"); +addkernclassf("t","tcaron","tcedilla"); +addkernclassf("v","w"); +addkernclassf("y","ydieresis","yacute"); + +addkernclasss("A","Abreve","Aogonek","Agrave","Aacute","Acircumflex","Atilde","Adieresis","Aring","AE","Germandbls"); +addkernclasss("C","G","O","Q","Cacute","Ccaron","Gbreve","Ohungarumlaut","Ccedilla","Ograve","Oacute","Ocircumflex","Otilde","Odieresis","OE","Oslash"); +addkernclasss("J"); +addkernclasss("S","Sacute","Scedilla","Scaron"); +addkernclasss("T","Tcaron","Tcedilla"); +addkernclasss("U","Uhungarumlaut","Ugrave","Uacute","Ucircumflex","Udieresis","IJ","Oslash"); +addkernclasss("V","W"); +addkernclasss("X"); +addkernclasss("Y","Ydieresis","Yacute"); +addkernclasss("a","aogonek","ae","germandbls"); +addkernclasss("abreve","agrave","aacute","acircumflex","atilde","adieresis","aring"); +addkernclasss("b","d","e","f","h","i","k","l","m","n","p","r","eogonek","lslash","lcaron","eng","thorn"); +addkernclasss("dcaron","ecaron","lacute","nacute","ncaron","racute","rcaron","egrave","eacute","edieresis","igrave","iacute","icircumflex","idieresis","ntilde"); +addkernclasss("c","g","o","q","ccedilla","oe","oslash"); +addkernclasss("cacute","ccaron","gbreve","ohungarumlaut","ograve","oacute","ocircumflex","otilde","odieresis"); +addkernclasss("j"); +addkernclasss("s","scedilla"); +addkernclasss("sacute","scaron"); +addkernclasss("t","tcedilla"); +addkernclasss("tcaron"); +addkernclasss("u"); +addkernclasss("uhungarumlaut","ugrave","uacute","ucircumflex","udieresis","ij"); +addkernclasss("v","w"); +addkernclasss("x"); +addkernclasss("y"); +addkernclasss("ydieresis","yacute"); +addkernclasss("z"); +addkernclasss("zacute","zcaron","zdotaccent"); +addkernclasss("period","comma"); + +addclasskern("A","T",-.5u#); +addclasskern("A","V",-.25u#); +addclasskern("B","C",.5u#); +addclasskern("B","T",-u#); +addclasskern("B","V",-.5u#); +addclasskern("B","c",.5u#); +addclasskern("B","cacute",.5u#); +addclasskern("C","C",-.5u#); +addclasskern("D","C",u#); +addclasskern("D","S",.5u#); % make compatible with METAPOST-logo +addclasskern("D","T",-.5u#); +addclasskern("D","X",-.5u#); +addclasskern("D","c",.5u#); +addclasskern("D","cacute",.5u#); +addclasskern("D","s",.5u#); % make compatible with METAPOST-logo +addclasskern("D","period",-u#); +addclasskern("F","C",-u#); % original +addclasskern("F","J",-3u#); +addclasskern("F","c",-u#); +addclasskern("F","cacute",-u#); +addclasskern("F","j",-3u#); +addclasskern("J","period",-u#); +addclasskern("K","C",-.5u#); +addclasskern("K","t",-u#); +addclasskern("L","T",-2.5u#); +addclasskern("L","V",-2u#); +addclasskern("L","Y",-2u#); +addclasskern("L","t",-2.5u#); +addclasskern("L","tcaron",-2.5u#); +addclasskern("L","v",-1.5u#); +addclasskern("L","y",-1.5u#); +addclasskern("L","ydieresis",-1.5u#); +addclasskern("P","C",u#); % original +addclasskern("P","J",-2u#); +addclasskern("P","V",-.25u#); +addclasskern("P","c",u#); +addclasskern("P","cacute",u#); +addclasskern("P","j",-2u#); +addclasskern("P","period",-3u#); +addclasskern("Thorn","T",-.5u#); +addclasskern("Thorn","V",-.25u#); +addclasskern("Thorn","X",-u#); +addclasskern("Thorn","period",-3u#); +addclasskern("Q","T",-.5u#); +addclasskern("Q","period",-u#); +addclasskern("R","C",u#); +addclasskern("S","C",u#); +addclasskern("S","T",-.5u#); % make compatible with METAPOST-logo +addclasskern("S","c",.5u#); +addclasskern("S","cacute",.5u#); +addclasskern("T","A",-.5u#); % original +addclasskern("T","C",-.5u#); +addclasskern("T","J",-2.5u#); +addclasskern("T","T",u#); +addclasskern("T","a",-1.5u#); +addclasskern("T","abreve",-u#); +addclasskern("T","b",-1.5u#); +addclasskern("T","dcaron",-u#); +addclasskern("T","c",-1.5u#); +addclasskern("T","cacute",-u#); +addclasskern("T","j",-u#); +addclasskern("T","s",-1.5u#); +addclasskern("T","sacute",-u#); +addclasskern("T","t",-1.5u#); +addclasskern("T","tcaron",-u#); +addclasskern("T","u",-1.5u#); +addclasskern("T","uhungarumlaut",-u#); +addclasskern("T","v",-1.5u#); +addclasskern("T","x",-1.5u#); +addclasskern("T","y",-1.5u#); +addclasskern("T","ydieresis",-u#); +addclasskern("T","z",-1.5u#); +addclasskern("T","zacute",-u#); +addclasskern("T","period",-3u#); +addclasskern("V","A",-.25u#); +addclasskern("V","C",-.25u#); +addclasskern("V","J",-u#); +addclasskern("V","V",u#); +addclasskern("V","a",-u#); +addclasskern("V","abreve",-.5u#); +addclasskern("V","b",-.5u#); +addclasskern("V","c",-u#); +addclasskern("V","cacute",-.5u#); +addclasskern("V","j",-u#); +addclasskern("V","s",-u#); +addclasskern("V","sacute",-.5u#); +addclasskern("V","u",-.5u#); +addclasskern("V","x",-.5u#); +addclasskern("V","ydieresis",.5u#); +addclasskern("V","z",-.5u#); +addclasskern("V","period",-3u#); +addclasskern("Y","J",-u#); +addclasskern("Y","j",-u#); +addclasskern("Y","period",-u#); +addclasskern("a","t",-.5u#); +addclasskern("a","tcaron",-.5u#); +addclasskern("a","v",-.25u#); +addclasskern("b","c",.5u#); +addclasskern("b","cacute",.5u#); +addclasskern("b","t",-u#); +addclasskern("b","tcaron",-u#); +addclasskern("b","v",-.5u#); +addclasskern("c","c",-.5u#); +addclasskern("c","cacute",-.5u#); +addclasskern("d","c",u#); +addclasskern("d","cacute",u#); +addclasskern("d","s",.5u#); % make compatible with METAPOST-logo +addclasskern("d","t",-.5u#); +addclasskern("d","tcaron",-.5u#); +addclasskern("d","x",-.5u#); +addclasskern("d","period",-u#); +addclasskern("f","c",-u#); +addclasskern("f","cacute",-u#); +addclasskern("f","j",-3u#); +addclasskern("j","period",-u#); +addclasskern("k","c",-.5u#); +addclasskern("k","cacute",-.5u#); +addclasskern("l","t",-2.5u#); +addclasskern("l","tcaron",-2.5u#); +addclasskern("l","v",-1.5u#); +addclasskern("l","y",-1.5u#); +addclasskern("l","ydieresis",-1.5u#); +addclasskern("p","C",u#); +addclasskern("p","j",-2u#); +addclasskern("p","v",-.25u#); +addclasskern("p","period",-3u#); +addclasskern("thorn","t",-.5u#); +addclasskern("thorn","tcaron",-.5u#); +addclasskern("thorn","v",-.25u#); +addclasskern("thorn","x",-u#); +addclasskern("thorn","period",-3u#); +addclasskern("q","t",-.5u#); +addclasskern("q","period",-u#); +addclasskern("r","c",u#); +addclasskern("r","cacute",u#); +addclasskern("s","t",-.5u#); % make compatible with METAPOST-logo +addclasskern("s","c",.5u#); +addclasskern("s","cacute",.5u#); +addclasskern("t","a",-.5u#); % original +addclasskern("t","abreve",-.5u#); +addclasskern("t","c",-.5u#); +addclasskern("t","cacute",-.5u#); +addclasskern("t","j",-2.5u#); +addclasskern("t","t",u#); +addclasskern("t","tcaron",u#); +addclasskern("t","period",-3u#); +addclasskern("v","a",-.25u#); +addclasskern("v","abreve",-.25u#); +addclasskern("v","c",-.25u#); +addclasskern("v","cacute",-.25u#); +addclasskern("v","j",-u#); +addclasskern("v","v",u#); +addclasskern("v","period",-3u#); +addclasskern("y","j",-u#); +addclasskern("y","period",-u#); + +%remember: ligatures will overwrite existing kerning pairs +addlig("f","i","fi"); +addlig("f","f","ff"); +addlig("f","l","fl"); +addlig("ff","i","ffi"); +addlig("ff","l","ffl"); +addlig("quoteleft","quoteleft","quotedblleft"); +addlig("quoteright","quoteright","quotedblright"); +addlig("comma","comma","quotedblbase"); +addlig("hyphen","hyphen","endash"); +addlig("endash","hyphen","emdash"); +addlig("less","less","guillemotleft"); +addlig("greater","greater","guillemotright"); +addlig("exclam","quoteleft","exclamdown"); +addlig("question","quoteleft","questiondown"); + +writeligtable; + +bye. |