% 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.