summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/fonts/source/public/fetamont/ffmbase.mf
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2017-03-14 21:51:16 +0000
committerKarl Berry <karl@freefriends.org>2017-03-14 21:51:16 +0000
commitd1c70ab27326385145a9d77d021834269f4d81a2 (patch)
treecd37e28c210ecb160f786e2cfea06eac3a43d060 /Master/texmf-dist/fonts/source/public/fetamont/ffmbase.mf
parent9cb26f3d0d652229032965f48c2a15afe0d52371 (diff)
fetamont (14mar17)
git-svn-id: svn://tug.org/texlive/trunk@43496 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/fonts/source/public/fetamont/ffmbase.mf')
-rw-r--r--Master/texmf-dist/fonts/source/public/fetamont/ffmbase.mf1586
1 files changed, 584 insertions, 1002 deletions
diff --git a/Master/texmf-dist/fonts/source/public/fetamont/ffmbase.mf b/Master/texmf-dist/fonts/source/public/fetamont/ffmbase.mf
index e27c3517009..1356a87de82 100644
--- a/Master/texmf-dist/fonts/source/public/fetamont/ffmbase.mf
+++ b/Master/texmf-dist/fonts/source/public/fetamont/ffmbase.mf
@@ -11,14 +11,13 @@
% 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
+if base_name<>"mf2outline":
+ message("This font has to be compiled");
+ message("with METAPOST and the base file");
+ message("mf2outline.mp! Using mf2outline.py");
+ message("makes things even easier.");
+fi
-font_coding_scheme "T1";
font_slant slant;
font_normal_space 6u#+2s#;
font_normal_stretch 3u#;
@@ -26,6 +25,27 @@ font_normal_shrink 2u#;
font_x_height x_ht#;
font_quad 18u#+2s#;
font_extra_space 2u#;
+font_coding_scheme "unicode";
+font_version "1.7";
+font_copyright "Copyright (c) 2014 by Linus Romer."
+ & "This work is released under the LaTeX project public license. "
+ & "The designs of the letters A, E, F, M, O, P, S and T rely heavily "
+ & "on the original design of the logo font family by "
+ & "Donald E. Knuth. The shapes of the glyphs Y and 1 have been "
+ & "imitated from the METATYPE1 logo.";
+
+ho#:=o#; % horizontal overshoot
+leftstemloc#:=2.5u#+s#; % position of left stem
+acc_gr#:=1.5acc_ht#; % height of Greek accents
+if not known has_variants:
+ has_variants:=0; % are random variants contained?
+fi
+variant:=0; % current variant
+string variantcode;
+variantcode:="F0000"; % starting code for variants %F0000
+
+mode_setup;
+currenttransform:=identity slanted slant yscaled aspect_ratio;
define_pixels(s,u);
define_whole_pixels(xgap);
@@ -34,535 +54,19 @@ 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_good_y_pixels(barheight,x_ht,ht,acc_ht,acc_gr);
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;
+numeric charwidths_[];
+numeric charheights_[];
+numeric chardepths_[];
+numeric charitalcorrs_[];
+picture charpictures_[];
+pair charanchortops_[];
+pair charanchorbots_[];
+pair charanchortoprights_[];
+pair charanchorcedillas_[];
% the randomization is fixed
% but still special for every style
@@ -585,78 +89,187 @@ 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_[];
+% varycode returns a code for a variant, if
+% variant>0 and
+vardef varycode(expr code) =
+ if variant>0:
+ variantcode := unicodeeps(epscode(variantcode)+epsilon);
+ unicodeeps(epscode(variantcode)-epsilon)
+ else:
+ code
+ fi
+enddef;
-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);
+def ffmchar(expr code, unit_width, height, depth) =
+ beginchar(varycode(code),
+ if unit_width=0: 0 else: unit_width*u#+2s# fi,
+ height,depth);
+ if variant>0:
+ addrandvariant(code,charunicode);
+ fi
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) =
- beginchar(enc(namea)+code_offset,charwidths_[enc(nameb)+code_offset],height,depth);
- charic:=charitalcorrs_[enc(nameb)+code_offset];
- addto currentpicture also charpictures_[enc(nameb)+code_offset];
+extra_endchar :=
+ extra_endchar
+ &"charpictures_[charepscode]:=currentpicture;"
+ &"charwidths_[charepscode]=charwd;"
+ &"charheights_[charepscode]=charht;"
+ &"chardepths_[charepscode]=chardp;"
+ &"charitalcorrs_[charepscode]=charic;";
+
+% the glyph with code a is anchor wise combined
+% from the glyphs with code b (base) and code c (accent)
+% the new height and depth shall be h and d
+def ffmcombinedchar(expr a,b,c,anchor,h,d) =
+ beginchar(varycode(a),charwidths_[epscode(b)],h,d);
+ if variant>0:
+ addrandvariant(a,charunicode);
+ fi
+ charic:=charitalcorrs_[epscode(b)];
+ charanchortops_[epscode(varycode(a))]=charanchortops_[epscode(b)];
+ charanchorbots_[epscode(varycode(a))]=charanchorbots_[epscode(b)];
+ charanchortoprights_[epscode(varycode(a))]=charanchortoprights_[epscode(b)];
+ charanchorcedillas_[epscode(varycode(a))]=charanchorcedillas_[epscode(b)];
+ if variant>0:
+ picepscode:=randvariants_[epscode(b)][variant];
+ else:
+ picepscode:=epscode(b);
+ fi
+ addto currentpicture also charpictures_[picepscode];
+ if variant>0:
+ picepscode:=randvariants_[epscode(c)][variant];
+ else:
+ picepscode:=epscode(c);
+ fi
if anchor="top":
- addto currentpicture also charpictures_[enc(namec)] shifted
- ((charanchortops_[enc(nameb)+code_offset]-charanchortops_[enc(namec)]) slanted slant);
+ addto currentpicture also charpictures_[picepscode] shifted
+ ((charanchortops_[epscode(b)]-charanchortops_[epscode(c)]) slanted slant);
elseif anchor="bot":
- addto currentpicture also charpictures_[enc(namec)] shifted
- ((charanchorbots_[enc(nameb)+code_offset]-charanchorbots_[enc(namec)]) slanted slant);
+ addto currentpicture also charpictures_[picepscode] shifted
+ ((charanchorbots_[epscode(b)]-charanchorbots_[epscode(c)]) slanted slant);
elseif anchor="topright":
- addto currentpicture also charpictures_[enc(namec)] shifted
- ((charanchortoprights_[enc(nameb)+code_offset]-charanchortoprights_[enc(namec)]) slanted slant);
+ addto currentpicture also charpictures_[picepscode] shifted
+ ((charanchortoprights_[epscode(b)]-charanchortoprights_[epscode(c)]) slanted slant);
+ elseif anchor="cedilla":
+ addto currentpicture also charpictures_[picepscode] shifted
+ ((charanchorcedillas_[epscode(b)]-charanchorcedillas_[epscode(c)]) 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)+code_offset,
- charwidths_[enc(nameb)+code_offset]
- +charwidths_[enc(namec)+code_offset],
- max(charheights_[enc(nameb)+code_offset],
- charheights_[enc(namec)+code_offset]),
- max(chardepths_[enc(nameb)+code_offset],
- chardepths_[enc(namec)+code_offset])
+% ffmchainedchar chains two chars like "f" (code b)
+% and "l" (code c) to "fl" (code a)
+% inbetween the chars may be a gap
+def ffmchainedchar(expr a,b,c,gap) =
+ beginchar(varycode(a),
+ charwidths_[epscode(b)]
+ +charwidths_[epscode(c)]+gap*u#,
+ max(charheights_[epscode(b)],
+ charheights_[epscode(c)]),
+ max(chardepths_[epscode(b)],
+ chardepths_[epscode(c)])
);
- charic:=charitalcorrs_[enc(nameb)+code_offset];
- addto currentpicture also charpictures_[enc(nameb)+code_offset];
- addto currentpicture also charpictures_[enc(namec)+code_offset]
- shifted (charwidths_[enc(nameb)+code_offset]*hppp,0);
+ if variant>0:
+ addrandvariant(a,charunicode);
+ fi
+ charic:=charitalcorrs_[epscode(b)];
+ if variant>0:
+ picepscode:=randvariants_[epscode(b)][variant];
+ else:
+ picepscode:=epscode(b);
+ fi
+ addto currentpicture also charpictures_[picepscode];
+ if variant>0:
+ picepscode:=randvariants_[epscode(c)][variant];
+ else:
+ picepscode:=epscode(c);
+ fi
+ addto currentpicture also charpictures_[picepscode]
+ shifted (charwidths_[epscode(b)]*hppp+gap*u#*hppp,0);
endchar;
enddef;
-% copy a letter nameb to namea
-def ffmcopiedchar(expr namea,nameb) =
- beginchar(
- enc(namea),
- charwidths_[enc(nameb)],
- charheights_[enc(nameb)],
- chardepths_[enc(nameb)]
+% copy a letter with code b to code a
+def ffmcopiedchar(expr a,b) =
+ beginchar(varycode(a),
+ charwidths_[epscode(b)],
+ charheights_[epscode(b)],
+ chardepths_[epscode(b)]
);
- charic:=charitalcorrs_[enc(nameb)];
- addto currentpicture also charpictures_[enc(nameb)];
+ if variant>0:
+ addrandvariant(a,charunicode);
+ fi
+ charic:=charitalcorrs_[epscode(b)];
+ charanchortops_[epscode(varycode(a))]=charanchortops_[epscode(b)];
+ charanchorbots_[epscode(varycode(a))]=charanchorbots_[epscode(b)];
+ charanchortoprights_[epscode(varycode(a))]=charanchortoprights_[epscode(b)];
+ charanchorcedillas_[epscode(varycode(a))]=charanchorcedillas_[epscode(b)];
+ if variant>0:
+ picepscode:=randvariants_[epscode(b)][variant];
+ else:
+ picepscode:=epscode(b);
+ fi
+ addto currentpicture also charpictures_[picepscode];
endchar;
enddef;
+% add a first kerning class (similar to addkernclassl
+% as in mf2outline.mp) but with random variants
+def addkernclassf(text a) =
+ begingroup
+ save i,l;
+ numeric i,l;
+ l:=hex(kernclassesl_[0][0])+1;
+ kernclassesl_[0][0]:=hexadecimal l;
+ i:=0; % number of chars in current class
+ for b=a:
+ i:=i+1;
+ kernclassesl_[l][i]:=unicode b;
+ % include also random variants
+ if has_variants=1:
+ if randvariants_[epscode(b)][0]>0:
+ for j=1 upto randvariants_[epscode(b)][0]:
+ i:=i+1;
+ kernclassesl_[l][i]:=unicodeeps(randvariants_[epscode(b)][j]);
+ endfor
+ fi
+ fi
+ endfor
+ % number of chars in current class is stored at 0th position
+ kernclassesl_[l][0]:=hexadecimal i;
+ endgroup
+enddef;
+
+% add a second kerning class (similar to addkernclassr
+% as in mf2outline.mp) but with random variants
+def addkernclasss(text a) =
+ begingroup
+ save i,l;
+ numeric i,l;
+ l:=hex(kernclassesr_[0][0])+1;
+ kernclassesr_[0][0]:=hexadecimal l;
+ i:=0; % number of chars in current class
+ for b=a:
+ i:=i+1;
+ kernclassesr_[l][i]:=unicode b;
+ % include also random variants
+ if has_variants=1:
+ if randvariants_[epscode(b)][0]>0:
+ for j=1 upto randvariants_[epscode(b)][0]:
+ i:=i+1;
+ kernclassesr_[l][i]:=unicodeeps(randvariants_[epscode(b)][j]);
+ endfor
+ fi
+ fi
+ endfor
+ % number of chars in current class is stored at 0th position
+ kernclassesr_[l][0]:=hexadecimal i;
+ endgroup
+enddef;
+
% an arc is kind of a quarter of a skewed superellipse
vardef arc(expr zi,diri,zj,dirj) =
zi{diri}...
@@ -689,528 +302,497 @@ def dotcircle(expr zi,zj) =
zi..zj..cycle & zi
enddef;
-% general letters with no lowercase counterpart
-input ffmchars_nonscalable
-% uppercase with lowercase counterpart
-input ffmchars_scalable
-% uppercase with no lowercase counterpart
-ffmcombinedchar("Idotaccent","I","dotaccent","top",ht#+acc_ht#,0);
-
-% 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";
-
-input ffmchars_scalable
-% restore the most important things
-code_offset:=0;
-u#:=u#/.9;
-define_pixels(u);
-
-ffmcopiedchar("dotlessi","i");
-ffmcopiedchar("dotlessj","j");
-ffmcopiedchar("dcroat","eth");
-ffmchainedchar("ff","f","f");
-ffmchainedchar("fi","f","i");
-ffmchainedchar("fl","f","l");
-ffmchainedchar("ffi","ff","i");
-ffmchainedchar("ffl","ff","l");
-
-% 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");
+%
+input ffmchars_uni
+if has_variants=1: % make 4 variants for RAND feature
+ variant := 1;
+ input ffmchars_uni
+ variant := 2;
+ input ffmchars_uni
+ variant := 3;
+ input ffmchars_uni
+ variant := 4;
+ input ffmchars_uni
+fi
+
+%------kerning-------
+addkernclassf("A","00C0","00C1","00C2","00C3","00C4","00C5","0100",
+ "0102","0104","0386","038F","0391","03A9","1EA0","1F08","1F09",
+ "1F0A","1F0B","1F0C","1F0D","1F0E","1F0F","1F68","1F69","1F6A",
+ "1F6B","1F6C","1F6D","1F6E","1F6F","1F88","1F89","1F8A","1F8B",
+ "1F8C","1F8D","1F8E","1F8F","1FA8","1FA9","1FAA","1FAB","1FAC",
+ "1FAD","1FAE","1FAF","1FB8","1FB9","1FBA","1FBB","1FBC","1FFA",
+ "1FFB","1FFC");
+addkernclassf("B","0392","1E9E");
+addkernclassf("C","00C7","0106","0108","010A","010C");
+addkernclassf("D","O","00D0","00D2","00D3","00D4","00D5","00D6",
+ "010E","0110","014C","014E","0150","018F","038C","0398","039F","03D8",
+ "1ECC","1F48","1F49","1F4A","1F4B","1F4C","1F4D","1FF8","1FF9");
+addkernclassf("F","03DC");
+addkernclassf("J","U","00D8","00D9","00DA","00DB","00DC","0132","0134",
+ "0168","016A","016C","016E","0170","0172");
+addkernclassf("K","0058","0136","039A","039E","03A3","03A7");
+addkernclassf("L","0139","013B","013D","0141");
+addkernclassf("P","03A1","1FEC");
+addkernclassf("00DE"); % Thorn
addkernclassf("Q");
-addkernclassf("R","Racute","Rcaron");
-addkernclassf("S","Sacute","Scedilla","Scaron");
-addkernclassf("T","Tcaron","Tcedilla");
-addkernclassf("V","W");
-addkernclassf("Y","Ydieresis","Yacute");
-addkernclassf("Z","Zacute","Zcaron","Zdotaccent");
-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("R","0154","0156","0158");
+addkernclassf("S","015A","015C","015E","0160","0218");
+addkernclassf("T","0162","0164","021A","0393","03A4");
+addkernclassf("V","W","0174","1E80","1E82","1E84");
+addkernclassf("Y","00DD","0176","0178","0232","038E","03A5","03A8",
+ "03AB","1EF2","1EF8","1F59","1F5B","1F5D","1F5F","1FE8","1FE9",
+ "1FEA","1FEB");
+addkernclassf("Z","0179","017B","017D","0396");
+addkernclassf("0394","039B","03E0"); % Delta, Lambda, ...
+addkernclassf("a","00E0","00E1","00E2","00E3","00E4","00E5","0101",
+ "0103","0105","03AC","03B1","03C9","03CE","1EA1","1F00","1F01",
+ "1F02","1F03","1F04","1F05","1F06","1F07","1F60","1F61","1F62",
+ "1F63","1F64","1F65","1F66","1F67","1F70","1F71","1F7C","1F7D",
+ "1F80","1F81","1F82","1F83","1F84","1F85","1F86","1F87","1FA0",
+ "1FA1","1FA2","1FA3","1FA4","1FA5","1FA6","1FA7","1FB0","1FB1",
+ "1FB2","1FB3","1FB4","1FB6","1FB7","1FF2","1FF3","1FF4","1FF6",
+ "1FF7");
+addkernclassf("b","00DF","03B2");
+addkernclassf("c","00E7","0109","010B","010D","03DB");
+addkernclassf("d","o","00F0","010F","0111","01DD","0259","03B8","03BF",
+ "03CC","03D9","1ECD","1F40","1F41","1F42","1F43","1F44","1F45",
+ "1F78","1F79");
+addkernclassf("f","FB00");
+addkernclassf("j","0075","00F9","00FA","00FB","00FC","0133","0135",
+ "016B","016D","016F","0171","0173","1EE5");
+addkernclassf("k","x","0137","0138","03BA","03BE","03C2","03C3","03C7");
+addkernclassf("l","013A","013C","013E","0140","0142","FB02","FB04");
+addkernclassf("p","03C1","1FE4","1FE5");
+addkernclassf("00FE"); % thorn
addkernclassf("q");
-addkernclassf("r","racute","rcaron");
-addkernclassf("s","scedilla","sacute","scaron");
-addkernclassf("t","tcaron","tcedilla");
-addkernclassf("v","w");
-addkernclassf("y","ydieresis","yacute");
-addkernclassf("zero","three","eight","nine");
-addkernclassf("two");
-addkernclassf("four");
-addkernclassf("five","six");
-addkernclassf("seven");
-
-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");
+addkernclassf("r","0155","0157","0159");
+addkernclassf("s","015B","015D","015F","0161","0219");
+addkernclassf("t","0163","0165","021B","03B3","03C4");
+addkernclassf("v","w","0175","1E81","1E83","1E85");
+addkernclassf("y","00FD","0177","03B0","03C5","03C8","03CD","1F50",
+ "1F51","1F52","1F53","1F54","1F55","1F56","1F57","1FE0","1FE1",
+ "1FE2","1FE3");
+addkernclassf("z","017A","017C","017E","03B6");
+addkernclassf("03B4","03BB","03E1"); % delta, lambda, ...
+addkernclassf("0030","0033","0038","0039"); % 0,3,8,9
+addkernclassf("0032"); % 2
+addkernclassf("0034"); % 4
+addkernclassf("0035","0036"); % 5,6
+addkernclassf("0037"); % 7
+
+addkernclasss("A","00C0","00C1","00C2","00C3","00C4","00C5",
+ "00C6","00D8","0102","0104","01FE","0391","1E9E",
+ "1EA0","1FB8","1FB9","1FBC");
+addkernclasss("C","G","O","Q","00C7","00D2","00D3",
+ "00D4","00D5","00D6","0106","0108","010A","010C",
+ "011C","011E","0120","0121","0122","014C","014E",
+ "0150","0152","0398","039F","03D8","1ECC","E001");
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("S","015A","015C","015E","0160","0218");
+addkernclasss("T","0162","0164","021A","03A4");
+addkernclasss("U","00D9","00DA","00DB","00DC","016C","016E",
+ "0170","0172");
+addkernclasss("V","W","1E80","1E82","1E84");
+addkernclasss("X","039E","03A3","03A7");
+addkernclasss("Y","00DD","0176","0178","0232","03A5","03A8",
+ "03AB","1EF2","1EF8","1F59","1F5B","1F5D","1F5F",
+ "1FE8","1FE9");
+addkernclasss("0394","039B"); % Delta, Lambda
+addkernclasss("a","00DF","00E6","0105","03B1","1EA1","1FB3");
+addkernclasss("00E0","00E1","00E2","00E3","00E4","00E5","0101",
+ "0103","01FD","03AC","1F00","1F01","1F02","1F03",
+ "1F04","1F05","1F06","1F07","1F70","1F71","1F80",
+ "1F81","1F82","1F83","1F84","1F85","1F86","1F87",
+ "1FB2","1FB4","1FB6","1FB7");
+addkernclasss("b","d","e","f","h","i","k",
+ "l","m","n","p","r","00FE","0119",
+ "012F","0131","0137","0138","013C","013E","0140",
+ "0146","014B","0157","03B3","03B7","03B9","03BA",
+ "03BC","03BD","03C0","03C1","03DD","1EB9","1ECB",
+ "1FC3","FB00","FB01","FB02","FB03","FB04");
+addkernclasss("00E8","00E9","00EA","00EB","00F1","010F","0117",
+ "011B","0125","0129","012B","012D","013A","0144",
+ "0148","0155","0159","03AD","03AE","03CA","1EBD",
+ "1F10","1F11","1F12","1F13","1F14","1F15","1F20",
+ "1F21","1F22","1F23","1F24","1F25","1F26","1F27",
+ "1F30","1F31","1F32","1F33","1F34","1F35","1F36",
+ "1F37","1F72","1F73","1F74","1F75","1F76","1F77",
+ "1F90","1F91","1F92","1F93","1F94","1F95","1F96",
+ "1F97","1FC2","1FC4","1FC6","1FC7","1FD0","1FD1",
+ "1FD2","1FD3","1FD6","1FD7","1FE4","1FE5");
+addkernclasss("c","g","o","00E7","0123","0153","03B8",
+ "03BF","03D9","03DB","1ECD");
+addkernclasss("00F2","00F3","00F4","00F5","00F6","0107","0109",
+ "010B","010D","011D","011F","014D","014F","0151",
+ "03CC","1F40","1F41","1F42","1F43","1F44","1F45");
+addkernclasss("j","0237");
+addkernclasss("0135");
+addkernclasss("s","015F","0219");
+addkernclasss("015B","015D","0161");
+addkernclasss("t","0163","021B","03C4");
+addkernclasss("0165");
+addkernclasss("u","0173","1EE5");
+addkernclasss("00F9","00FA","00FB","00FC","0169","016B","016D",
+ "016F");
addkernclasss("v","w");
-addkernclasss("x");
-addkernclasss("y");
-addkernclasss("ydieresis","yacute");
-addkernclasss("z");
-addkernclasss("zacute","zcaron","zdotaccent");
-addkernclasss("period","comma");
-addkernclasss("zero","six","eight");
-addkernclasss("one");
-addkernclasss("two");
-addkernclasss("three");
-addkernclasss("four");
-addkernclasss("five");
-addkernclasss("seven");
-addkernclasss("nine");
+addkernclasss("1E81","1E83","1E85");
+addkernclasss("x","03BE","03C2","03C3","03C7");
+addkernclasss("y","03C5","03C8");
+addkernclasss("00FD","00FF","0177","0233","03B0","03CB","03CD",
+ "1EF3","1F50","1F51","1F52","1F53","1F54","1F55",
+ "1F56","1F57","1F7A","1F7B","1FE0","1FE1","1FE2",
+ "1FE3","1FE6","1FE7");
+addkernclasss("z","03B6");
+addkernclasss("017A","017C","017E");
+addkernclasss("03B4","03BB"); % delta, lambda
+addkernclasss("002C","002E"); % comma, period
+addkernclasss("0030","0036","0038"); % 0, 6, 8
+addkernclasss("0031"); % 1
+addkernclasss("0032"); % 2
+addkernclasss("0033"); % 3
+addkernclasss("0034"); % 4
+addkernclasss("0035"); % 5
+addkernclasss("0037"); % 7
+addkernclasss("0039"); % 9
addclasskern("A","T",-.5u#);
addclasskern("A","V",-.25u#);
-addclasskern("A","one",-.25u#);
-addclasskern("A","three",-.5u#);
-addclasskern("A","seven",-u#);
+addclasskern("A","0031",-.25u#);
+addclasskern("A","0033",-.5u#);
+addclasskern("A","0037",-u#);
addclasskern("B","C",.5u#);
addclasskern("B","T",-u#);
addclasskern("B","V",-.5u#);
addclasskern("B","c",.5u#);
-addclasskern("B","cacute",.5u#);
-addclasskern("B","zero",.5u#);
-addclasskern("B","seven",-u#);
+addclasskern("B","00F2",.5u#);
+addclasskern("B","0030",.5u#);
+addclasskern("B","0037",-u#);
addclasskern("C","C",-.5u#);
-addclasskern("C","zero",-.5u#);
-addclasskern("C","one",-u#);
-addclasskern("C","four",-u#);
+addclasskern("C","0030",-.5u#);
+addclasskern("C","0031",-u#);
+addclasskern("C","0034",-u#);
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","00F2",.5u#);
addclasskern("D","s",.5u#);
-addclasskern("D","period",-u#);
-addclasskern("D","zero",.5u#);
-addclasskern("D","one",.5u#);
-addclasskern("D","two",.5u#);
-addclasskern("D","four",.5u#);
-addclasskern("D","nine",u#);
+addclasskern("D","015B",.5u#);
+addclasskern("D","002C",-u#);
+addclasskern("D","0030",.5u#);
+addclasskern("D","0031",.5u#);
+addclasskern("D","0032",.5u#);
+addclasskern("D","0034",.5u#);
+addclasskern("D","0039",u#);
addclasskern("F","C",-u#); % original
addclasskern("F","J",-3u#);
addclasskern("F","c",-u#);
-addclasskern("F","cacute",-u#);
+addclasskern("F","00F2",-u#);
addclasskern("F","j",-3u#);
-addclasskern("F","period",-3u#);
-addclasskern("F","zero",-u#);
-addclasskern("F","one",-.5u#);
-addclasskern("F","two",-.5u#);
-addclasskern("F","three",-.5u#);
-addclasskern("F","four",-u#);
-addclasskern("F","seven",-.5u#);
-addclasskern("J","period",-u#);
-addclasskern("J","three",-.5u#);
-addclasskern("J","four",-.5u#);
-addclasskern("K","C",-.5u#);
+addclasskern("F","0135",-u#);
+addclasskern("F","002C",-3u#);
+addclasskern("F","0030",-u#);
+addclasskern("F","0031",-.5u#);
+addclasskern("F","0032",-.5u#);
+addclasskern("F","0033",-.5u#);
+addclasskern("F","0034",-u#);
+addclasskern("F","0037",-.5u#);
+addclasskern("J","002C",-u#);
+addclasskern("J","0033",-.5u#);
+addclasskern("J","0034",-.5u#);
+%addclasskern("K","C",-.5u#);
addclasskern("K","t",-u#);
-addclasskern("K","one",-.5u#);
-addclasskern("K","two",.5u#);
-addclasskern("K","three",.5u#);
-addclasskern("K","four",-.5u#);
+addclasskern("K","0031",-.5u#);
+addclasskern("K","0032",.5u#);
+addclasskern("K","0033",.5u#);
+addclasskern("K","0034",-.5u#);
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","0165",-2.5u#);
addclasskern("L","v",-1.5u#);
+addclasskern("L","1E81",-1.5u#);
addclasskern("L","y",-1.5u#);
-addclasskern("L","ydieresis",-1.5u#);
-addclasskern("L","zero",.5u#);
-addclasskern("L","one",-u#);
-addclasskern("L","two",.5u#);
-addclasskern("L","three",.5u#);
-addclasskern("L","seven",-u#);
+addclasskern("L","00FD",-1.5u#);
+addclasskern("L","0030",.5u#);
+addclasskern("L","0031",-u#);
+addclasskern("L","0032",.5u#);
+addclasskern("L","0033",.5u#);
+addclasskern("L","0037",-u#);
addclasskern("P","C",u#); % original
addclasskern("P","J",-2u#);
addclasskern("P","V",-.25u#);
addclasskern("P","c",u#);
-addclasskern("P","cacute",u#);
+addclasskern("P","00F2",u#);
addclasskern("P","j",-2u#);
-addclasskern("P","period",-3u#);
-addclasskern("P","zero",.5u#);
-addclasskern("P","one",.5u#);
-addclasskern("P","two",-.5u#);
-addclasskern("P","three",-.5u#);
-addclasskern("P","four",-.5u#);
-addclasskern("P","seven",-.25u#);
-addclasskern("P","nine",u#);
-addclasskern("Thorn","T",-.5u#);
-addclasskern("Thorn","V",-.25u#);
-addclasskern("Thorn","X",-u#);
-addclasskern("Thorn","period",-3u#);
-addclasskern("Thorn","one",.5u#);
-addclasskern("Thorn","three",-u#);
-addclasskern("Thorn","seven",-.5u#);
+addclasskern("P","002C",-3u#);
+addclasskern("P","0030",.5u#);
+addclasskern("P","0031",.5u#);
+addclasskern("P","0032",-.5u#);
+addclasskern("P","0033",-.5u#);
+addclasskern("P","0034",-.5u#);
+addclasskern("P","0037",-.25u#);
+addclasskern("P","0039",u#);
+addclasskern("00DE","T",-.5u#);
+addclasskern("00DE","V",-.25u#);
+addclasskern("00DE","X",-u#);
+addclasskern("00DE","002C",-3u#);
+addclasskern("00DE","0031",.5u#);
+addclasskern("00DE","0033",-u#);
+addclasskern("00DE","0037",-.5u#);
addclasskern("Q","C",u#);
addclasskern("Q","S",.5u#);
addclasskern("Q","T",-.5u#);
addclasskern("Q","c",.5u#);
-addclasskern("Q","cacute",.5u#);
+addclasskern("Q","00F2",.5u#);
addclasskern("Q","s",.5u#);
-addclasskern("Q","zero",u#);
-addclasskern("Q","one",.5u#);
-addclasskern("Q","two",u#);
-addclasskern("Q","three",.5u#);
-addclasskern("Q","four",.5u#);
-addclasskern("Q","five",.5u#);
-addclasskern("Q","nine",u#);
+addclasskern("Q","015B",.5u#);
+addclasskern("Q","0030",u#);
+addclasskern("Q","0031",.5u#);
+addclasskern("Q","0032",u#);
+addclasskern("Q","0033",.5u#);
+addclasskern("Q","0034",.5u#);
+addclasskern("Q","0035",.5u#);
+addclasskern("Q","0039",u#);
addclasskern("R","C",u#);
-addclasskern("R","zero",u#);
-addclasskern("R","one",.5u#);
-addclasskern("R","two",.5u#);
-addclasskern("R","five",.5u#);
-addclasskern("R","nine",u#);
+addclasskern("R","0030",u#);
+addclasskern("R","0031",.5u#);
+addclasskern("R","0032",.5u#);
+addclasskern("R","0035",.5u#);
+addclasskern("R","0039",u#);
addclasskern("S","C",u#);
addclasskern("S","T",-.5u#); % make compatible with METAPOST-logo
addclasskern("S","c",.5u#);
-addclasskern("S","cacute",.5u#);
-addclasskern("S","zero",.5u#);
-addclasskern("S","three",-.5u#);
-addclasskern("S","seven",-.5u#);
+addclasskern("S","00F2",.5u#);
+addclasskern("S","0030",.5u#);
+addclasskern("S","0033",-.5u#);
+addclasskern("S","0037",-.5u#);
addclasskern("T","A",-.5u#); % original
addclasskern("T","C",-.5u#);
addclasskern("T","J",-2.5u#);
addclasskern("T","T",u#);
+addclasskern("T","0394",-1.5u#);
addclasskern("T","a",-1.5u#);
-addclasskern("T","abreve",-u#);
+addclasskern("T","00E0",-u#);
addclasskern("T","b",-1.5u#);
-addclasskern("T","dcaron",-u#);
+addclasskern("T","00E8",-u#);
addclasskern("T","c",-1.5u#);
-addclasskern("T","cacute",-u#);
+addclasskern("T","00F2",-u#);
addclasskern("T","j",-u#);
addclasskern("T","s",-1.5u#);
-addclasskern("T","sacute",-u#);
+addclasskern("T","015B",-u#);
addclasskern("T","t",-1.5u#);
-addclasskern("T","tcaron",-u#);
+addclasskern("T","0165",-u#);
addclasskern("T","u",-1.5u#);
-addclasskern("T","uhungarumlaut",-u#);
+addclasskern("T","00F9",-u#);
addclasskern("T","v",-1.5u#);
+addclasskern("T","1E81",-u#);
addclasskern("T","x",-1.5u#);
addclasskern("T","y",-1.5u#);
-addclasskern("T","ydieresis",-u#);
+addclasskern("T","00FD",-u#);
addclasskern("T","z",-1.5u#);
-addclasskern("T","zacute",-u#);
-addclasskern("T","period",-3u#);
-addclasskern("T","one",-.5u#);
-addclasskern("T","two",.5u#);
-addclasskern("T","three",.5u#);
-addclasskern("T","four",-u#);
-addclasskern("T","seven",u#);
+addclasskern("T","03B4",-1.5u#);
+addclasskern("T","017A",-u#);
+addclasskern("T","002C",-3u#);
+addclasskern("T","0031",-.5u#);
+addclasskern("T","0032",.5u#);
+addclasskern("T","0033",.5u#);
+addclasskern("T","0034",-u#);
+addclasskern("T","0037",u#);
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","00E0",-.5u#);
addclasskern("V","b",-.5u#);
addclasskern("V","c",-u#);
-addclasskern("V","cacute",-.5u#);
+addclasskern("V","00F2",-.5u#);
addclasskern("V","j",-u#);
+addclasskern("V","0135",-.5u#);
addclasskern("V","s",-u#);
-addclasskern("V","sacute",-.5u#);
+addclasskern("V","015B",-.5u#);
addclasskern("V","u",-.5u#);
addclasskern("V","x",-.5u#);
-addclasskern("V","ydieresis",.5u#);
+addclasskern("V","00FD",.5u#);
addclasskern("V","z",-.5u#);
-addclasskern("V","period",-3u#);
-addclasskern("V","zero",-.25u#);
-addclasskern("V","four",-u#);
+addclasskern("V","002C",-3u#);
+addclasskern("V","0030",-.25u#);
+addclasskern("V","0034",-u#);
addclasskern("Y","C",-.5u#);
addclasskern("Y","J",-u#);
addclasskern("Y","j",-u#);
-addclasskern("Y","period",-u#);
-addclasskern("Y","zero",-.5u#);
-addclasskern("Y","two",-u#);
-addclasskern("Y","three",-.5u#);
-addclasskern("Y","four",-u#);
-addclasskern("Y","five",-.5u#);
-addclasskern("Y","seven",-.5u#);
+addclasskern("Y","0135",-.5u#);
+addclasskern("Y","002C",-u#);
+addclasskern("Y","0030",-.5u#);
+addclasskern("Y","0032",-u#);
+addclasskern("Y","0033",-.5u#);
+addclasskern("Y","0034",-u#);
+addclasskern("Y","0035",-.5u#);
+addclasskern("Y","0037",-.5u#);
addclasskern("Z","C",-.5u#);
-addclasskern("Z","zero",-.5u#);
-addclasskern("Z","one",-u#);
-addclasskern("Z","two",-.5u#);
-addclasskern("Z","three",-.5u#);
-addclasskern("Z","four",-u#);
-addclasskern("Z","five",-.5u#);
-addclasskern("Z","seven",-.5u#);
-addclasskern("Z","nine",-.5u#);
+addclasskern("Z","0030",-.5u#);
+addclasskern("Z","0031",-u#);
+addclasskern("Z","0032",-.5u#);
+addclasskern("Z","0033",-.5u#);
+addclasskern("Z","0034",-u#);
+addclasskern("Z","0035",-.5u#);
+addclasskern("Z","0037",-.5u#);
+addclasskern("Z","0039",-.5u#);
+addclasskern("0394","T",-.75u#);
+addclasskern("0394","Y",-u#);
+addclasskern("0394","0031",-.5u#);
+addclasskern("0394","0033",-.5u#);
+addclasskern("0394","0037",-u#);
+addclasskern("0394","t",-.5u#);
+addclasskern("0394","y",-.75u#);
+addclasskern("0394","00FD",-.75u#);
+
addclasskern("a","t",-.5u#);
-addclasskern("a","tcaron",-.5u#);
+addclasskern("a","0165",-.5u#);
addclasskern("a","v",-.25u#);
+addclasskern("a","1E81",-.25u#);
addclasskern("b","c",.5u#);
-addclasskern("b","cacute",.5u#);
+addclasskern("b","00F2",.5u#);
addclasskern("b","t",-u#);
-addclasskern("b","tcaron",-u#);
+addclasskern("b","0165",-u#);
addclasskern("b","v",-.5u#);
+addclasskern("b","1E81",-.5u#);
addclasskern("c","c",-.5u#);
-addclasskern("c","cacute",-.5u#);
-addclasskern("c","four",-.5u#);
+addclasskern("c","00F2",-.5u#);
+addclasskern("c","0034",-.5u#);
addclasskern("d","c",u#);
-addclasskern("d","cacute",u#);
+addclasskern("d","00F2",u#);
addclasskern("d","s",.5u#); % make compatible with METAPOST-logo
+addclasskern("d","015B",.5u#);
addclasskern("d","t",-.5u#);
-addclasskern("d","tcaron",-.5u#);
+addclasskern("d","0165",-.5u#);
addclasskern("d","x",-.5u#);
-addclasskern("d","period",-u#);
-addclasskern("d","zero",.5u#);
-addclasskern("d","two",.5u#);
-addclasskern("d","four",.5u#);
+addclasskern("d","002C",-u#);
+addclasskern("d","0030",.5u#);
+addclasskern("d","0032",.5u#);
+addclasskern("d","0034",.5u#);
addclasskern("f","c",-u#);
-addclasskern("f","cacute",-u#);
+addclasskern("f","00F2",-u#);
addclasskern("f","j",-3u#);
-addclasskern("f","period",-3u#);
-addclasskern("f","two",-u#);
-addclasskern("f","four",-.5u#);
-addclasskern("j","period",-u#);
-addclasskern("k","c",-.5u#);
-addclasskern("k","cacute",-.5u#);
-addclasskern("k","zero",.5u#);
+addclasskern("f","0135",-3u#);
+addclasskern("f","002C",-3u#);
+addclasskern("f","0032",-u#);
+addclasskern("f","0034",-.5u#);
+addclasskern("j","002C",-u#);
+%addclasskern("k","c",-.5u#);
+%addclasskern("k","00F2",-.5u#);
+addclasskern("k","0030",.5u#);
addclasskern("l","t",-2.5u#);
-addclasskern("l","tcaron",-2.5u#);
+addclasskern("l","0165",-2.5u#);
addclasskern("l","v",-1.5u#);
+addclasskern("l","1E81",-1.5u#);
addclasskern("l","y",-1.5u#);
-addclasskern("l","ydieresis",-1.5u#);
+addclasskern("l","00FD",-1.5u#);
addclasskern("p","c",u#);
+addclasskern("p","00F2",u#);
addclasskern("p","j",-2u#);
+addclasskern("p","0135",-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("p","1E81",-.25u#);
+addclasskern("p","002C",-3u#);
+addclasskern("00FE","t",-.5u#);
+addclasskern("00FE","0165",-.5u#);
+addclasskern("00FE","v",-.25u#);
+addclasskern("00FE","0135",-.25u#);
+addclasskern("00FE","x",-u#);
+addclasskern("00FE","002C",-3u#);
addclasskern("q","t",-.5u#);
-addclasskern("q","period",-u#);
-addclasskern("q","zero",u#);
-addclasskern("q","two",u#);
-addclasskern("q","four",.5u#);
-addclasskern("q","five",.5u#);
+addclasskern("q","002C",-u#);
+addclasskern("q","0030",u#);
+addclasskern("q","0032",u#);
+addclasskern("q","0034",.5u#);
+addclasskern("q","0035",.5u#);
addclasskern("r","c",u#);
-addclasskern("r","cacute",u#);
+addclasskern("r","00F2",u#);
addclasskern("s","t",-.5u#); % make compatible with METAPOST-logo
+addclasskern("s","0165",-.5u#);
addclasskern("s","c",.5u#);
-addclasskern("s","cacute",.5u#);
+addclasskern("s","00F2",.5u#);
addclasskern("t","a",-.5u#); % original
-addclasskern("t","abreve",-.5u#);
+addclasskern("t","00E0",-.5u#);
addclasskern("t","c",-.5u#);
-addclasskern("t","cacute",-.5u#);
+addclasskern("t","00F2",-.5u#);
addclasskern("t","j",-2.5u#);
+addclasskern("t","0135",-2u#);
addclasskern("t","t",u#);
-addclasskern("t","tcaron",u#);
-addclasskern("t","period",-3u#);
-addclasskern("t","zero",.5u#);
+addclasskern("t","0165",u#);
+addclasskern("t","002C",-3u#);
+addclasskern("t","0030",.5u#);
addclasskern("v","a",-.25u#);
-addclasskern("v","abreve",-.25u#);
+addclasskern("v","00E0",-.25u#);
addclasskern("v","c",-.25u#);
-addclasskern("v","cacute",-.25u#);
+addclasskern("v","00F2",-.25u#);
addclasskern("v","j",-u#);
+addclasskern("v","0135",-u#);
addclasskern("v","v",u#);
-addclasskern("v","period",-3u#);
-addclasskern("v","zero",.5u#);
+addclasskern("v","1E81",u#);
+addclasskern("v","002C",-3u#);
+addclasskern("v","0030",.5u#);
addclasskern("y","j",-u#);
-addclasskern("y","period",-u#);
-addclasskern("y","zero",-.5u#);
-addclasskern("y","four",-.5u#);
-
-addclasskern("zero","C",.5u#);
-addclasskern("zero","S",.5u#);
-addclasskern("zero","V",-.5u#);
-addclasskern("zero","c",.5u#);
-addclasskern("zero","cacute",.5u#);
-addclasskern("zero","j",.5u#);
-addclasskern("zero","s",.5u#);
-addclasskern("zero","sacute",.5u#);
-addclasskern("zero","t",.5u#);
-addclasskern("zero","tcaron",.5u#);
-addclasskern("zero","v",.5u#);
-addclasskern("zero","x",.5u#);
-addclasskern("zero","y",-.5u#);
-addclasskern("zero","ydieresis",-.5u#);
-addclasskern("zero","period",-u#);
-addclasskern("two","U",-.25u#);
-addclasskern("two","V",-.5u#);
-addclasskern("two","Y",-.5u#);
-addclasskern("two","j",.5u#);
-addclasskern("two","t",.5u#);
-addclasskern("two","tcaron",.5u#);
-addclasskern("two","y",-.5u#);
-addclasskern("two","ydieresis",-.5u#);
-addclasskern("four","C",.5u#);
-addclasskern("four","V",-.5u#);
-addclasskern("four","Y",-.5u#);
-addclasskern("four","c",.5u#);
-addclasskern("four","cacute",.5u#);
-addclasskern("four","y",-.5u#);
-addclasskern("four","ydieresis",-.5u#);
-addclasskern("four","z",-.5u#);
-addclasskern("five","y",-.5u#);
-addclasskern("five","ydieresis",-.5u#);
-addclasskern("seven","t",.5u#);
-addclasskern("seven","tcaron",.5u#);
-
-%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;
+addclasskern("y","0135",-u#);
+addclasskern("y","002C",-u#);
+addclasskern("y","0030",-.5u#);
+addclasskern("y","0034",-.5u#);
+addclasskern("03B4","0031",-.25u#);
+addclasskern("03B4","0033",-.25u#);
+addclasskern("03B4","0037",-.5u#);
+addclasskern("03B4","t",-.25u#);
+addclasskern("03B4","y",-.5u#);
+addclasskern("03B4","00FD",-.5u#);
+
+addclasskern("0030","C",.5u#);
+addclasskern("0030","S",.5u#);
+addclasskern("0030","V",-.5u#);
+addclasskern("0030","c",.5u#);
+addclasskern("0030","00F2",.5u#);
+addclasskern("0030","j",.5u#);
+addclasskern("0030","s",.5u#);
+addclasskern("0030","015B",.5u#);
+addclasskern("0030","t",.5u#);
+addclasskern("0030","0165",.5u#);
+addclasskern("0030","v",.5u#);
+addclasskern("0030","x",.5u#);
+addclasskern("0030","y",-.5u#);
+addclasskern("0030","00FD",-.5u#);
+addclasskern("0030","002C",-u#);
+addclasskern("0032","U",-.25u#);
+addclasskern("0032","V",-.5u#);
+addclasskern("0032","Y",-.5u#);
+addclasskern("0032","j",.5u#);
+addclasskern("0032","0135",.5u#);
+addclasskern("0032","t",.5u#);
+addclasskern("0032","0165",.5u#);
+addclasskern("0032","y",-.5u#);
+addclasskern("0032","00FD",-.5u#);
+addclasskern("0034","C",.5u#);
+addclasskern("0034","V",-.5u#);
+addclasskern("0034","Y",-.5u#);
+addclasskern("0034","c",.5u#);
+addclasskern("0034","00F2",.5u#);
+addclasskern("0034","y",-.5u#);
+addclasskern("0034","00FD",-.5u#);
+addclasskern("0034","z",-.5u#);
+addclasskern("0035","y",-.5u#);
+addclasskern("0035","00FD",-.5u#);
+addclasskern("0037","t",.5u#);
+addclasskern("0037","0165",.5u#);
+
+%------ligatures-------
+addligature("FB00","f","f");
+addligature("FB01","f","i");
+addligature("FB02","f","l");
+addligature("FB03","f","f","i");
+addligature("FB03","FB00","i");
+addligature("FB04","f","f","l");
+addligature("FB03","FB00","l");
bye.