summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/fonts/source/public/fetamont/ffmbase.mf
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/fonts/source/public/fetamont/ffmbase.mf')
-rw-r--r--Master/texmf-dist/fonts/source/public/fetamont/ffmbase.mf1306
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.